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

How to get an actual code coverage report in IntelliJ IDEA?

我有一个简单的 class 叫做 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;
    }
}

还有一个名为 TheTest 的测试 class:

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);
    }
}

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

当我让语句单独一行时,我得到了正确的结果:

尽管代码完全相同,但我只是根据代码的结构得到了不同的结果。当一条线的一部分没有被实际覆盖时,我怎么能指示它没有被覆盖?

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

这在 IntelliJ 的帮助网站上有进一步的记录。参见 Configure code coverage options