当所有的测试都是最新的时候,如何运行评级测试?

我已经写好成绩单了。 当我执行 Gradle 构建时,一切都正常运行,它运行 jUnit 测试。

在那之后,当我运行格拉德尔测试时,我会得到以下结果:

C:\Users\..\..\Project>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE

当我执行 gradle clean,然后分级建设工程,当然..。 我希望能够只重置测试,而不是构建整个项目: 我应该如何做到这一点?

93594 次浏览

一种选择是在 强制执行任务部分中使用 --rerun-tasks标志。这将重新运行所有测试任务及其所依赖的所有任务。

如果您只对重新运行测试感兴趣,那么另一个选择是在执行测试之前清理测试结果。这可以通过使用 cleanTest任务来完成。

一些背景—— Java 插件为每个其他任务定义了一个干净的任务。根据 任务的文件:

CleantaskName -删除指定任务创建的文件。CleanTest 将删除 JAR 任务创建的 JAR 文件,并删除测试任务创建的测试结果。

因此,重新运行测试所需的全部操作就是运行 cleanTest任务,即:
gradle cleanTest test

gradle test --rerun-tasks

指定忽略任何任务优化。

资料来源: https://gradle.org/docs/current/userguide/gradle_command_line.html

另一个选项是在 build.gradle 中添加以下内容:

test.outputs.upToDateWhen {false}

还有, 必须添加 --rerun-tasks实在是多余的。从来没有发生过。创建一个 --no-rerun-tasks并使 --rerun-tasks默认时 cleanTask

下面是一个使用“ build.gradle”文件的解决方案,以防您不想修改命令行:

test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}

下面是输出结果,注意前面输出的2个变化:

1)输出中会出现一个新的“ cleanTest”任务。

2)“测试”总是被清理(例如从来没有“最新”) ,所以它每次都被执行:

$ gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:cleanTest
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build

这是最近的话题,在格拉德尔的博客文章 停止重新运行您的测试作者展示了一个使用 outputs.upToDateWhen { false }的例子,并解释了其错误之处:

这实际上并不强制重播

这个代码片段的作者可能想说的是“始终重新运行我的测试”。但这个片段不是这样的。这只会标志着这项任务已经过时,迫使 Gradle 政府将产出转化为 ABc0。但问题是,如果启用了构建缓存,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()
}

我推荐阅读整篇博客文章。

--rerun-tasks可以工作,但效率低下,因为它会重新运行所有任务。

由于构建缓存,cleanTest本身可能不够。

所以,最好的办法就是:

./gradlew --no-build-cache cleanTest test

DR

test.dependsOn cleanTest

上述方法对我都不管用。
对我来说,有效的方法是简单地从 /Users/<username>/.gradle/caches/build-cache-1/的缓存目录中删除所有项。