gpt4 book ai didi

java - 如何在不使用 Linux 命令行中的 Maven/Ant 的情况下为 Jenkins 生成coverage.xml?

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:29 25 4
gpt4 key购买 nike

你好!

问题描述

我对 Linux、Jenkins 和自动化测试相当陌生。我想知道运行代码后如何从 Linux 命令行或 Jenkins 环境生成 coverage.xml(见下文)?

在 Jenkins 中,我想使用 Cobertura 或 Jacoco 来显示我的代码覆盖率。我使用 shell 脚本(bash)来清理(删除 .class 文件)、编译并从 Jenkins(或命令行)运行测试。

我有一个非常简单的 java 程序,它使用一组非常简单的单元测试和一个性能测试 (testNG)。

额外

如果可能的话,我想找到一种不使用 Maven 或 Ant 来生成此 coverage.xml 的方法。因为即使在我的 IDE 中我也不知道如何生成它,所以我很感激任何有关如何获取 coverage.xml 的解释性答案。

如果不可能,我该如何为 Maven 编写 pom.xml 才能使其正常工作?

代码:程序

该程序是 FizzBu​​zz 数学游戏的自动化、简单版本,每个玩家轮流计数,用另一个单词(例如“Fizz”,但在本例中为“Cowabunga”)替换与所述分母均匀分母的每个数字。

main.java

public class main {
public static void main(String[] args){
StartGame game = new StartGame();
game.start();
}
}

StartGame.java

public class StartGame {
public static void start() {
GameRules gr = new GameRules(3,5);
gr.startGame();
}
}

GameRules.java

public class GameRules {
private int currentNumber;
private int currentPlayer;
private int playUntilThisNumber;
private int dividerToSkip;
private List<Player> playerlist;


public GameRules(int numberOfPlayers, int divider){
playerlist = new ArrayList<Player>();
currentNumber=1;
currentPlayer=3;
playUntilThisNumber = 100;
dividerToSkip = divider;
fillPlayerList(numberOfPlayers);
}

public int getCurrentNumber() {
return currentNumber;
}

public void increaseCurrentNumber() {
this.currentNumber++;
}

private void fillPlayerList(int numberOfPlayers){
for(int i = 0 ; i < numberOfPlayers ; i++){
Player p = new Player(this, i+1,dividerToSkip);
playerlist.add(p);
}
}

public void startGame(){
while(currentNumber<=playUntilThisNumber){
System.out.println(playerlist.get(currentPlayer++%playerlist.size()).play());
}
}
}

Player.java

public class Player {
private GameRules rules;
private int dividerToSkip;
private int playerNumber;


public Player(GameRules r, int playerNr, int divider){
rules = r;
dividerToSkip = divider;
playerNumber = playerNr;
}

public String play() {
String s;
if(rules.getCurrentNumber()%dividerToSkip==0){
s = "Player " + playerNumber + ": Cowabunga";
}
else {
s = "Player " + playerNumber + ": " +rules.getCurrentNumber();
}
rules.increaseCurrentNumber();
return s;
}
}

代码:测试

GameRuleTest.java

public class GameRulesTest {
private int nrOfPLayers;
private int divider;
private GameRules gr;

@BeforeMethod
public void setUp(){
nrOfPLayers = 35;
divider = 13;
gr = new GameRules(nrOfPLayers,divider);
}

@Test
public void testCurrentNumber(){
assert (gr.getCurrentNumber()>0);
}

@Test
public void testIncreaseCurrentNumber() {
int cn = gr.getCurrentNumber();
gr.increaseCurrentNumber();
assert(gr.getCurrentNumber()==cn+1);
}
}

PlayerTest.java

public class PlayerTest {
private int nrOfPLayers;
private int divider;
private GameRules gr;
private Player player;

@BeforeMethod
public void setUp(){
nrOfPLayers = 35;
divider = 13;
gr = new GameRules(nrOfPLayers,divider);
player = new Player(gr,100,divider);
}

@Test
public void testReturnString() {
String res = player.play();

assert "Player 100: 1".equals(res) : "Expected correct return string, got " + res;

assertEquals("Player 100: 1", res);
}
}

性能测试.java

public class PerformanceTest {
private StartGame game;

@BeforeMethod
public void setUp(){
game = new StartGame();
}

@Test
public void testExecutionTime(){
long startTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
game.start();
long finnishTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
System.out.println(startTime);
System.out.println(finnishTime);
assert (finnishTime-startTime<0.0000005);
}
}

代码:脚本

clean.sh

#!/bin/bash
find . -name '*.class' | xargs rm

编译.sh

#!/bin/bash
javac src/MindRoad/*.java
javac -cp src/:testng-6.8/testng-6.8.jar test/*.java

测试.sh

#!/bin/bash
java -cp testng-6.8/testng-6.8.jar:test:src org.testng.TestNG -verbose 2 test/test.xml

测试.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="MindGameSuite" verbose="1" >
<test name="MindGame" >
<classes>
<class name="PlayerTest" />
<class name="GameRulesTest" />
<class name="PerformanceTest" />
</classes>
</test>
</suite>

预先感谢您的所有帮助!此致,RKrogh!

最佳答案

如果您正在谈论 Cobertura 覆盖率报告,那么您很幸运 - Cobertura 允许您从命令行运行该工具。

#Create the meta file (after javac)
cobertura-instrument.bat [--basedir dir] [--datafile file] [--auxClasspath classPath] [--destination dir] [--ignore regex] classes [...]

#Execution should include this extra jar in cp:
#Example
java -cp C:\cobertura\lib\cobertura.jar;C:\MyProject\build\instrumented;C:\MyProject\build\classes;C:\MyProject\build\test-classes -Dnet.sourceforge.cobertura.datafile=C:\MyProject\build\cobertura.ser ASimpleTestCase

#Publish the report
cobertura-report.bat --format xml --datafile C:\MyProject\build\cobertura.ser --destination C:\MyProject\reports\coverage C:\MyProject\src

This site会对你有所帮助。

关于java - 如何在不使用 Linux 命令行中的 Maven/Ant 的情况下为 Jenkins 生成coverage.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26215929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com