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;
}
}
我想列出 类 在执行每个单元测试期间触及的内容。我想发现哪些测试的范围过大,应该使用较小的单元。通过 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;
}
}