Java Jenkins中的Cobertura代码覆盖率报告似乎给出了相同的统计数据,无论测试的扩展如何 问题

Java Jenkins中的Cobertura代码覆盖率报告似乎给出了相同的统计数据,无论测试的扩展如何 问题,java,jenkins,testng,code-coverage,cobertura,Java,Jenkins,Testng,Code Coverage,Cobertura,无论运行多少测试,从脚本和Cobertura创建的代码覆盖率报告似乎都提供了相同的覆盖率。Jenkins的Cobertura插件总是向我显示相同的图表,我应该运行所有测试还是不运行任何测试。 问题描述 我是Jenkins、Cobertura和整个代码覆盖范围的初学者。我有一个简单的Java项目(见下面的代码:程序),它在TestNG中运行一些简单的测试(见下面的代码:Test)。一些脚本正在处理编译和测试(请参阅下面的代码:脚本),这些脚本在Jenkins的Build:Execute Shell

无论运行多少测试,从脚本和Cobertura创建的代码覆盖率报告似乎都提供了相同的覆盖率。Jenkins的Cobertura插件总是向我显示相同的图表,我应该运行所有测试还是不运行任何测试。

问题描述 我是Jenkins、Cobertura和整个代码覆盖范围的初学者。我有一个简单的Java项目(见下面的代码:程序),它在TestNG中运行一些简单的测试(见下面的代码:Test)。一些脚本正在处理编译和测试(请参阅下面的代码:脚本),这些脚本在Jenkins的Build:Execute Shell中按以下顺序提供给Jenkins:

  • clean.sh
  • compile.sh
  • test-coverage.sh
  • (test.sh)
现在,在test-coverage.sh中,Cobertura插入程序的源代码(代码:program part),创建一个coverage.xml,它应该(而且似乎确实)包含测试运行后代码的覆盖率

但是,如果我删除一个测试(或者全部,这无关紧要)并再次运行它,coverage.xml似乎给了我与在所有测试都完好无损的情况下运行它相同的统计信息

我做错了什么?我是否误解了这个概念?我是否也应该为我的测试课程配备仪器

代码:程序 该程序是一个自动化的、简单版的FizzBuzz数学游戏,每个玩家轮流数数,用另一个单词(例如“Fizz”,但在本例中是“Cowabunga”)替换由上述分母平均表示的每个数字

main.java StartGame.java GameRules.java 代码:测试 GameRuleTest.java PlayerTest.java PerformanceTest.java compile.sh test.sh test-coverage.sh test.xml

coverage.xml(生成时)

src
public class main {
    public static void main(String[] args){
        StartGame game = new StartGame();
        game.start();
    }
}
public class StartGame {
    public static void start() {
        GameRules gr = new GameRules(3,5);
        gr.startGame();
    }
}
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());
        }
    }
}
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;
    }
}
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);
        } 
    }
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);
    }
}
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);
    }
}
#!/bin/bash

find . -name '*.class' | xargs rm
rm -rf instrumented cobertura.ser cobertura_report test-output
#!/bin/bash
javac src/MyProject/*.java
javac -cp src/:testng-6.8/testng-6.8.jar test/*.java
#!/bin/bash
java -cp testng-6.8/testng-6.8.jar:test:src org.testng.TestNG -verbose 2 test/test.xml
#!/bin/bash

COBERTURA=cobertura-2.0.3
INSTRUMENTED=instrumented
REPORTDIR=cobertura_report

mkdir -p $INSTRUMENTED
mkdir -p $REPORTDIR

# Instrument the classes that we want to check coverage on
$COBERTURA/cobertura-instrument.sh src/MyProject/*.class --destination $INSTRUMENTED || exit

# Run the tests
java -cp $COBERTURA/$COBERTURA.jar:$INSTRUMENTED:testng-6.8/testng-6.8.jar:test org.testng.TestNG -verbose 2 test/test.xml

# Generate report
$COBERTURA/cobertura-report.sh --format xml --destination $REPORTDIR src

# Check coverage
#$COBERTURA/cobertura-check.sh --branch 0
<!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>
<?xml version="1.0"?>
<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">

<coverage line-rate="0.8888888888888888" branch-rate="1.0" lines-covered="32" lines-valid="36" branches-covered="6" branches-valid="6" complexity="1.3333333333333333" version="2.0.3" timestamp="1412942052582">
    <sources>
        <source>src</source>
    </sources>
    <packages>
        <package name="MyProject" line-rate="0.8888888888888888" branch-rate="1.0" complexity="1.3333333333333333">
            <classes>
                <class name="MyProject.GameRules" filename="MyProject/GameRules.java" line-rate="1.0" branch-rate="1.0" complexity="1.4">
                    <methods>
                        <method name="&lt;init&gt;" signature="(II)V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="23" hits="1" branch="false"/>
                                <line number="24" hits="1" branch="false"/>
                                <line number="25" hits="1" branch="false"/>
                                <line number="26" hits="1" branch="false"/>
                                <line number="27" hits="1" branch="false"/>
                                <line number="28" hits="1" branch="false"/>
                                <line number="29" hits="1" branch="false"/>
                                <line number="30" hits="1" branch="false"/>
                            </lines>
                        </method>
                        <method name="fillPlayerList" signature="(I)V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="50" hits="4" branch="true" condition-coverage="100% (2/2)">
                                    <conditions>
                                        <condition number="0" type="jump" coverage="100%"/>
                                    </conditions>
                                </line>
                                <line number="51" hits="3" branch="false"/>
                                <line number="52" hits="3" branch="false"/>
                                <line number="54" hits="1" branch="false"/>
                            </lines>
                        </method>
                        <method name="getCurrentNumber" signature="()I" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="36" hits="180" branch="false"/>
                            </lines>
                        </method>
                        <method name="increaseCurrentNumber" signature="()V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="43" hits="100" branch="false"/>
                                <line number="44" hits="100" branch="false"/>
                            </lines>
                        </method>
                        <method name="startGame" signature="()V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="61" hits="101" branch="true" condition-coverage="100% (2/2)">
                                    <conditions>
                                        <condition number="0" type="jump" coverage="100%"/>
                                    </conditions>
                                </line>
                                <line number="62" hits="100" branch="false"/>
                                <line number="64" hits="1" branch="false"/>
                            </lines>
                        </method>
                    </methods>
                    <lines>
                        <line number="23" hits="1" branch="false"/>
                        <line number="24" hits="1" branch="false"/>
                        <line number="25" hits="1" branch="false"/>
                        <line number="26" hits="1" branch="false"/>
                        <line number="27" hits="1" branch="false"/>
                        <line number="28" hits="1" branch="false"/>
                        <line number="29" hits="1" branch="false"/>
                        <line number="30" hits="1" branch="false"/>
                        <line number="36" hits="180" branch="false"/>
                        <line number="43" hits="100" branch="false"/>
                        <line number="44" hits="100" branch="false"/>
                        <line number="50" hits="4" branch="true" condition-coverage="100% (2/2)">
                            <conditions>
                                <condition number="0" type="jump" coverage="100%"/>
                            </conditions>
                        </line>
                        <line number="51" hits="3" branch="false"/>
                        <line number="52" hits="3" branch="false"/>
                        <line number="54" hits="1" branch="false"/>
                        <line number="61" hits="101" branch="true" condition-coverage="100% (2/2)">
                            <conditions>
                                <condition number="0" type="jump" coverage="100%"/>
                            </conditions>
                        </line>
                        <line number="62" hits="100" branch="false"/>
                        <line number="64" hits="1" branch="false"/>
                    </lines>
                </class>
                <class name="MyProject.Player" filename="MyProject/Player.java" line-rate="1.0" branch-rate="1.0" complexity="1.5">
                    <methods>
                        <method name="&lt;init&gt;" signature="(LMyProject/GameRules;II)V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="20" hits="3" branch="false"/>
                                <line number="21" hits="3" branch="false"/>
                                <line number="22" hits="3" branch="false"/>
                                <line number="23" hits="3" branch="false"/>
                                <line number="24" hits="3" branch="false"/>
                            </lines>
                        </method>
                        <method name="play" signature="()Ljava/lang/String;" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="32" hits="100" branch="true" condition-coverage="100% (2/2)">
                                    <conditions>
                                        <condition number="0" type="jump" coverage="100%"/>
                                    </conditions>
                                </line>
                                <line number="33" hits="20" branch="false"/>
                                <line number="36" hits="80" branch="false"/>
                                <line number="38" hits="100" branch="false"/>
                                <line number="39" hits="100" branch="false"/>
                            </lines>
                        </method>
                    </methods>
                    <lines>
                        <line number="20" hits="3" branch="false"/>
                        <line number="21" hits="3" branch="false"/>
                        <line number="22" hits="3" branch="false"/>
                        <line number="23" hits="3" branch="false"/>
                        <line number="24" hits="3" branch="false"/>
                        <line number="32" hits="100" branch="true" condition-coverage="100% (2/2)">
                            <conditions>
                                <condition number="0" type="jump" coverage="100%"/>
                            </conditions>
                        </line>
                        <line number="33" hits="20" branch="false"/>
                        <line number="36" hits="80" branch="false"/>
                        <line number="38" hits="100" branch="false"/>
                        <line number="39" hits="100" branch="false"/>
                    </lines>
                </class>
                <class name="MyProject.StartGame" filename="MyProject/StartGame.java" line-rate="1.0" branch-rate="1.0" complexity="1.0">
                    <methods>
                        <method name="&lt;init&gt;" signature="()V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="6" hits="1" branch="false"/>
                            </lines>
                        </method>
                        <method name="start" signature="()V" line-rate="1.0" branch-rate="1.0">
                            <lines>
                                <line number="8" hits="1" branch="false"/>
                                <line number="9" hits="1" branch="false"/>
                                <line number="10" hits="1" branch="false"/>
                            </lines>
                        </method>
                    </methods>
                    <lines>
                        <line number="6" hits="1" branch="false"/>
                        <line number="8" hits="1" branch="false"/>
                        <line number="9" hits="1" branch="false"/>
                        <line number="10" hits="1" branch="false"/>
                    </lines>
                </class>
                <class name="MyProject.main" filename="MyProject/main.java" line-rate="0.0" branch-rate="1.0" complexity="1.0">
                    <methods>
                        <method name="&lt;init&gt;" signature="()V" line-rate="0.0" branch-rate="1.0">
                            <lines>
                                <line number="7" hits="0" branch="false"/>
                            </lines>
                        </method>
                        <method name="main" signature="([Ljava/lang/String;)V" line-rate="0.0" branch-rate="1.0">
                            <lines>
                                <line number="14" hits="0" branch="false"/>
                                <line number="15" hits="0" branch="false"/>
                                <line number="16" hits="0" branch="false"/>
                            </lines>
                        </method>
                    </methods>
                    <lines>
                        <line number="7" hits="0" branch="false"/>
                        <line number="14" hits="0" branch="false"/>
                        <line number="15" hits="0" branch="false"/>
                        <line number="16" hits="0" branch="false"/>
                    </lines>
                </class>
            </classes>
        </package>
    </packages>
</coverage>