the*_*mer 6 java code-coverage intellij-idea gradle jacoco
我在intellij中有一个gradle项目(java)。我右键单击intellij中的项目,然后运行Run Tests in projectName with coverage,该项目在右侧创建了一些测试报告。在那右边,我有像
| Class, % | Method, % | Line, %
--------------------------------------
80%(80/100) 50%(100/200) 30%(30/100)
Run Code Online (Sandbox Code Playgroud)
注意:以上数字仅作为示例。这些不是真实的。
现在,我进入命令行并运行gradlew jacocoTestReport,它给出了different set of numbersMethod和Line,但是Class numbers were same。为什么在这种情况下会有差异?
有没有一种方法可以从命令行运行intellij的代码覆盖范围,而不是右键单击?
我只是想知道Intellij是否使用不同的方式来计算这些数字,而不是jacoco。但是即使在那种情况下,我的假设是只有一种方法可以计算东西对吗?还是intellij或jacoco不计算包含Lombok注释等的类,从而减少了最终计数中方法(获取器和设置器)的数量?
我在一次相关任务中偶然发现了这个问题,虽然它很旧,但我认为它可能仍然对某人感兴趣。
方法编号
主要问题是 intellij 覆盖率和 jacoco 计算数字的方式是否不同,以及哪种方式是正确的。简短回答:intellij 覆盖率摘要使用开发人员直接提供的方法,而 jacoco 在字节码级别上运行并显示在那里找到的方法数量。为了演示这一点,我创建了一个包含四个方法的简单类:
public class Exp {
private final LinkedList<Integer> vals = new LinkedList<>();
public void addVal(int v) {
vals.add(v);
}
public List<Integer> doubled() {
return vals.stream().map(x -> x*2).collect(Collectors.toList());
}
public List<Integer> evens() {
return vals.stream().filter(x -> x%2 == 0).collect(Collectors.toList());
}
public static void main(String[] args) {
Exp t = new Exp();
t.addVal(1);
t.addVal(2);
t.addVal(3);
System.out.println(t.doubled());
System.out.println(t.evens());
}
}
Run Code Online (Sandbox Code Playgroud)
intellij 摘要中在右侧显示以下值:
因此方法的数量等于示例代码中的方法的数量。Jacoco报告了7种方法,在报告中可以看到(与eclipse 2020-09中的Emma插件相同):

这是我们可以在字节码中找到的方法数量,例如通过使用 javap 反汇编命令。这里我们看到两个 lambda 表达式被实现为类的方法,并且还插入了一个标准构造函数。
C:\_workspace\intellij\Tests\out\production\mod>javap -p Exp.class
Compiled from "Exp.java"
public class Exp {
private final java.util.LinkedList<java.lang.Integer> vals;
public Exp();
public void addVal(int);
public java.util.List<java.lang.Integer> doubled();
public java.util.List<java.lang.Integer> evens();
public static void main(java.lang.String[]);
private static boolean lambda$evens$1(java.lang.Integer);
private static java.lang.Integer lambda$doubled$0(java.lang.Integer);
}
Run Code Online (Sandbox Code Playgroud)
让我有点困惑的是intellij覆盖率报告(Run->Generate Corevage Report)显示了五种方法:
将标准构造函数添加到代码中并重新生成报告会发现该报告包含生成的标准构造函数,但不包含 lambda 表达式。似乎有一种中间的计数方法。
至于 intellij 或 jacoco 是否正确的问题我会说他们都是,这只是一个定义问题。
行号
在我的测试中,所有报告都显示一致的行号。在上面的示例中,报告了包含可执行代码的 13 行。我对覆盖率摘要中的 intellij 行数的印象是它并不总是正确刷新。可能需要进行彻底的重建。
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |