Gradle + TestNG:如何列出单元测试触及了哪些 类?

Gradle + TestNG: How to list which classes were touched by a unit test?

我想列出 类 在执行每个单元测试期间触及的内容。我想发现哪些测试的范围过大,应该使用较小的单元。通过 IntelliJ 或 JaCoCo 测量代码覆盖率对我没有帮助,因为我无法深入到单个测试。有没有人设法做类似的事情?我找到一个 similar question 十年前有人问过,但一直没有回答。我目前将 Java 8 与 Gradle 和 TestNG 一起使用。我觉得我必须构建一些 Gradle 插件或以某种方式修改 TestNG,但我不知道从哪里开始。

非常感谢任何帮助。

好的,我发现 Openclover 可以做到这一点。我已经设置了一个虚拟的 Maven 项目,当我通过这个命令链执行测试时:

mvn clean clover:setup test clover:aggregate clover:clover

然后clover在我项目的“target\site\clover”子目录下生成了一份报告。在该目录中有一个 index.html,您可以使用它来浏览结果。您需要导航到测试和特定测试方法以查看故障。它看起来像这样:

我们可以看到BalanceCalculatorTest的testCalculateBalance方法覆盖了BalanceCalculator、PriorServiceBalanceProvider和TimeAccount,但是没有看到TimeAccountProvider,因为它在测试中被mock了。我将粘贴代码片段,以便您了解全貌。底线是,它有效,但不是很用户友好。

public class BalanceCalculatorTest {

@Test
public void testCalculateBalance() {
    TimeAccountProvider timeAccountProvider = Mockito.mock(TimeAccountProvider.class);
    Mockito.doReturn(Collections.singleton(new TimeAccount())).when(timeAccountProvider).getTimeAccounts();
    BalanceCalculator balanceCalculator = new BalanceCalculator(timeAccountProvider);
    Assert.assertEquals(balanceCalculator.calculateBalance(), 2);
}

}

public class BalanceCalculator {

private final TimeAccountProvider timeAccountProvider;

public BalanceCalculator(TimeAccountProvider timeAccountProvider) {
    this.timeAccountProvider = timeAccountProvider;
}

public int calculateBalance() {
    Set<TimeAccount> timeAccounts = timeAccountProvider.getTimeAccounts();
    int sum = 0;
    for (TimeAccount timeAccount : timeAccounts) {
        Set<TimeAccountDetail> bookings = timeAccount.getTimeAccountDetails();
        sum += bookings.stream()
                .mapToInt(TimeAccountDetail::getAmount)
                .sum();
    }
    sum += new PriorServiceBalanceProvider().getPriorBalance();
    return sum;
}

}