如何在 IntelliJ IDEA 中获得实际的代码覆盖率报告?

Sta*_*123 3 java testing intellij-idea test-coverage

我有一个简单的类叫做SomeClass

public class SomeClass {

    public int value = 0;

    public void inc() {
        value++;
    }

    public void dec()
    {
        if (isBiggerThanFive()) value--;
        value--;
    }

    private boolean isBiggerThanFive() {
        return value > 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个名为的测试类TheTest

class TheTest {

    SomeClass t;

    @BeforeEach
    void setUp() {
        t = new SomeClass();
    }

    @Test
    public void whenNewTestIsCreated_ValueIsZero()
    {
        assertEquals(t.value, 0);
    }

    @Test
    public void whenIncIsCalledWithValueOfZero_ValueIsOne()
    {
        t.inc();
        assertEquals(t.value, 1);
    }

    @Test
    public void whenDecIsCalledWithValueOfZero_ValueIsNegativeOne()
    {
        t.dec();
        assertEquals(t.value, -1);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意函数dec的结构以及整个 if 条件和语句如何在同一行上。测试中,当数值大于5时,这部分减2不测试。所以我假设我应该在覆盖率报告中看到这部分没有被覆盖。但这就是我得到的:

相反,当我让声明在它自己的行上时,我得到了正确的结果:

即使代码完全相同,我也会根据代码的结构得到不同的结果。当一条线没有被实际覆盖时,我怎么能知道它的一部分没有被覆盖?

Ivo*_*ori 7

IntelliJ 的测试覆盖运行器具有不同的运行设置(出于性能原因)。默认情况下,使用该Sampling模式。这导致代码行覆盖率可忽略不计(执行)减速。 IntelliJ 测试覆盖率采样设置 现在,如果您想准确收集分支覆盖率(例如 if 语句),则可以使用该Trace模式。 IntelliJ 测试覆盖跟踪设置 使用该Trace模式,您将获得以下测试覆盖率。

跟踪覆盖报告

跟踪覆盖命中

这在 IntelliJ 的帮助网站上有进一步的记录。请参阅配置代码覆盖率选项