通过命令行使用 Junit 和 Jacoco,java 覆盖率为 0%

标签 java junit code-coverage jacoco

我在所有这些过程中只使用了“命令行”,并且我想这样做。(不使用 Ant、maven、gradle 等)

我想运行 Junit 测试用例和 JaCoCo 覆盖率估计。

首先,下面是我的代码

Calculator.java:

public class Calculator {
  public int evaluate(String expression) {

    int sum = 0;
    for(String summand: expression.split("\\+"))
        sum += Integer.valueOf(summand);
    System.out.println("Hello World!!");
    return sum;
  }
}

CalculatorTest.java:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression(){
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}

2个java文件位于C\Cal中,Cal文件夹包含4个jar文件 (junit-4.12.jarhamcrest-core-1.3.jarjacococli.jarjacocoagent.jar )

在这种情况下,我创建了类文件Calculator.class

javac Calculator.java

然后,我制作了 exec (我认为它是 jacoco 的执行文件)文件来估计 Calculator.java 文件的单元测试覆盖率。

java -javaagent:jacocoagent.jar=destfile=jacoco.exec

之后,我使用 exec 文件和命令提取了报告

java -jar jacococli.jar report jacoco.exec --classfiles Calculator.class --html "report" --name jacocoReport --sourcefiles "Calulator.java"

但是,我做的html报告中的测试覆盖率为0%。

这是我的问题:

  1. 你知道为什么我的覆盖率是 0% 吗?

  2. 尝试提取我想要的覆盖结果时有什么问题吗?

  3. 通过CalculatorTest.java代码计算Calculator.java文件的覆盖率并提取报告时,的写法是否正确--类文件仅使用Calculator.class

  4. 即使在 --sourcefiles 中同时插入 Calculator.javaCalculatorTest.java,结果也没有区别。我是不是写错了?或者说--sourcefiles的作用是什么?

这是我引用的互联网页面:

最佳答案

Do you know why my coverage is 0%?

There is no difference in the results even if you insert both Calculator.java and CalculatorTest.java in --sourcefiles. Did I put it wrong? Or what is the effect of --sourcefiles?

--sourcefiles 应指向包含包的目录。在您的情况下,您的文件使用默认包(无包),因此 --sourcefiles 应指向包含 Calculator.java 的目录。

Is there any problem in trying to extract the coverage result I want?

不 - 没有问题。例如,src 目录中包含 Calculator.javatest-src

目录中包含 CalculatorTest.java
mkdir classes
javac src/Calculator.java -d classes
mkdir test-classes
javac -cp junit-4.12.jar:classes test-src/CalculatorTest.java -d test-classes
java -javaagent:jacoco-0.8.1/lib/jacocoagent.jar -cp junit-4.12.jar:hamcrest-core-1.3.jar:classes:test-classes org.junit.runner.JUnitCore CalculatorTest
java -jar jacoco-0.8.1/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --html report

生成以下报告

report

When calculating the coverage of the Calculator.java file by CalculatorTest.java code and extracting the report, is it correct to write --classfiles only using Calculator.class?

--classfiles 应指向类文件、包含类文件的目录或包含类文件的存档,这些文件应出现在报告中。上面的示例中未指定 CalculatorTest.class,因此它不会出现在报告中。如果指定:

java -jar jacoco-0.8.1/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --classfiles test-classes --sourcefiles test-src --html report

report

关于通过命令行使用 Junit 和 Jacoco,java 覆盖率为 0%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506057/

相关文章:

java - Jacoco 插件不报告重命名的集成测试类的覆盖率

c++ - 我想告诉 VC++ 编译器编译所有代码。可以吗?

java - 尝试通过在子类中扩展类来向类添加方法?

java - 如何找到两个整数数组之间的差异?

java - 创建一个 Java 报告项目——想要使用 JUnit 和 Ant,但不知道如何使用

java - Gradle 与在同一线程中运行的同一类的方法并行运行测试类

java - 如何验证方法内部正在启动的方法?

java - 如何使 cxf jax-rs response.readEntity 成为通用的

java - 使用 ldap 时出现 AcceptSecurityContext 错误

.net-core - .NET Core 类似 AxoCover 的体验