最近,这是Gradle博客文章停止重新运行测试中的主题。在笔者给出了一个例子使用outputs.upToDateWhen { false }
,并解释为什么它是错误的:
这实际上并不强制重新运行
该摘录的作者可能想说的是“始终重新运行我的测试”。这不是此代码片段的功能。它只会将任务标记为过期,从而迫使Gradle 重新创建输出。但是,如果启用了构建缓存,则Gradle不需要运行任务来重新创建输出。它将在缓存中找到一个条目,并将结果解压缩到测试的输出目录中。
此代码段也是如此:
test.dependsOn cleanTest
清除输出后,Gradle将从构建缓存中解压缩测试结果,因此不会重新运行任何内容。简而言之,这些片段造成了非常昂贵的无操作。
如果您现在正在考虑“好的,我也将停用缓存”,那么让我告诉您为什么不应该这样做。
然后,作者继续说明为什么重新运行某些测试会浪费时间:
您的绝大多数测试应该是确定性的,即,在输入相同的条件下,它们应该产生相同的结果。
在少数情况下,您确实想在代码未更改的情况下重新运行测试,则应将它们建模为输入。这是博客文章中的两个示例,它们显示了添加输入,以便任务在最新检查期间使用它。
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
我建议阅读整个博客文章。