gpt4 book ai didi

java - 为什么 Intellij 代码覆盖率和 jacoco 代码覆盖率显示不同的百分比?

转载 作者:行者123 更新时间:2023-12-03 10:04:18 25 4
gpt4 key购买 nike

我在 intellij 中有一个 gradle 项目(java)。我右键单击 intellij 中的项目并运行 Run Tests in projectName with coverage在右侧创建了一些测试报告。在那个右手边我有像

| Class, %   | Method, %   | Line, %
--------------------------------------
80%(80/100) 50%(100/200) 30%(30/100)

注:以上数字仅为举例。这些都不是真的。

现在我转到命令行并运行 gradlew jacocoTestReport这给了一个 different set of numbers用于方法和行,但 Class numbers were same .为什么在这种情况下会出现差异?

有没有办法从命令行运行 intellij 的代码覆盖率而不是右键单击?

我只想知道 Intellij 是否使用与 jacoco 不同的方法来计算这些数字。但即使在那种情况下,我的假设是只有一种方法可以计算东西,对吗?或者 intellij 或 jacoco 不计算具有 Lombok 注释等的类,从而减少最终计数中方法(getter 和 setter)的数量?

最佳答案

我在一个相关的任务中偶然发现了这个问题,虽然它很旧,但我认为它可能对某人来说仍然很有趣。
方法编号
主要问题是 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());
}
}
在 Intellij 摘要中,右侧显示以下值:
intellij coverage summary
所以方法的数量等于示例代码中的方法数量。 Jacoco 报告了七种方法,可以在报告中看到(与 eclipse 2020-09 中的 Emma 插件相同):
jacoco test report
这是我们可以在字节码中找到的方法数,例如通过使用 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);
}
让我有点困惑的是,intellij 覆盖率报告(Run->Generate Corevage Report)显示了五种方法:
intellij coverage report
向代码中添加标准构造函数并重新生成报告显示报告包含生成的标准构造函数,但不包含 lambda 表达式。似乎有一种中间计数方法。
至于 intellij 或 jacoco 是否正确的问题,我会说它们都是正确的,这只是一个定义问题。
行号
在我的测试中,所有报告都显示一致的行号。在上面的示例中,报告了 13 行包含可执行代码。我对覆盖率摘要中的 intellij 行数的印象是它不会一直正确刷新。可能需要彻底重建。

关于java - 为什么 Intellij 代码覆盖率和 jacoco 代码覆盖率显示不同的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58627793/

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