简体   繁体   English

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

[英]How can I generate a coverage.xml for Jenkins without using Maven/Ant from the Linux command line?

Hello! 你好!

Problem description 问题描述

I am fairly new to Linux, Jenkins and automated testing. 我对Linux,Jenkins和自动化测试还很陌生。 I wonder how I can generate a coverage.xml from the Linux command line or the Jenkins environment after running my code (see below)? 我想知道如何在运行代码后如何从Linux命令行或Jenkins环境生成coverage.xml

In Jenkins I want to show my code coverage by using Cobertura or Jacoco. 在Jenkins中,我想使用Cobertura或Jacoco展示我的代码覆盖率。 I use shell scripts (bash) to clean (removing the .class files), compile and run the tests from Jenkins (or the command line). 我使用shell脚本(bash)进行清理(删除.class文件),从Jenkins(或命令行)编译并运行测试。

I have a very simple program in java that uses a set of very simple unit tests and one performance test ( testNG ). 我在Java中有一个非常简单的程序,该程序使用一组非常简单的单元测试和一个性能测试( testNG )。

Extra 额外

I would like to find a way to generate this coverage.xml without the use of Maven or Ant if possible. 我想找到一种在不使用Maven或Ant的情况下生成此coverage.xml的方法。 As I do not know how to generate it even in my IDE I am gratefull for any explanatory answer in how to get a coverage.xml . 因为即使在我的IDE中也不知道如何生成它,所以对于如何获取coverage.xml的任何解释性的答案我都很感激。

If it is not possible, how could I write my pom.xml for Maven to get this to work? 如果不可能,如何为Maven编写pom.xml以使其正常工作?

Code: Program 代码:程序

The program is an automated, simple version of the FizzBuzz math game, where each player takes turns to count up, replacing each number that is evenly denomainated by a said denominator by another word (ex. "Fizz" but in this example "Cowabunga"). 该程序是FizzBu​​zz数学游戏的自动化简单版本,每个玩家轮流进行计数,将用一个分母均匀表示的每个数字替换为另一个单词(例如“ Fizz”,但在此示例中为“ Cowabunga” )。

main.java main.java

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

StartGame.java StartGame.java

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

GameRules.java 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;
    }
}

Code: Tests 代码:测试

GameRuleTest.java 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 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);
    }
}

PerformanceTest.java PerformanceTest.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);
    }
}

Code: Scripts 代码:脚本

clean.sh clean.sh

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

compile.sh 编译

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

test.sh test.sh

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

test.xml test.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>

Thank you in advance for all your help! 预先感谢您的所有帮助! Sincerely, RKrogh! 真诚的,RKrogh!

If you are talking about the Cobertura coverage report, you are at luck - Cobertura allows you to run the tool from command line. 如果您在谈论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 would help you. 该站点将为您提供帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM