当所有测试都是最新的时,如何运行 Gradle 测试?
How to run Gradle test when all tests are UP-TO-DATE?
我已经设置了成绩脚本。
当我执行 Gradle 构建时,一切正常,它 运行 是 jUnit 测试。
之后,当我 运行 Gradle 测试时,我得到以下结果:
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
时,然后 Gradle 构建工作,当然......
我希望能够仅重置测试,而不是构建整个项目:我应该怎么做?
一个选项是在 Forcing tasks to execute 部分使用 --rerun-tasks
标志。这将重新运行所有测试任务及其依赖的所有任务。
如果您只对重新运行测试感兴趣,那么另一种选择是让gradle在执行测试之前清理测试结果。这可以使用 cleanTest
任务来完成。
一些背景 - Java 插件为每个其他任务定义了一个干净的任务。根据 Tasks 文档:
cleanTaskName - Deletes files created by specified task. cleanJar will delete the JAR file created by the jar task, and cleanTest will delete the test results created by the test task.
因此,要重新运行 测试,您还需要运行 cleanTest
任务,即:
gradle cleanTest test
gradle test --rerun-tasks
Specifies that any task optimization is ignored.
来源:https://gradle.org/docs/current/userguide/gradle_command_line.html
其他选择是在您的 build.gradle 中添加以下内容:
test.outputs.upToDateWhen {false}
此外,
必须添加 --rerun-tasks
确实是多余的。永远不会发生。创建一个 --no-rerun-tasks
并在 cleanTask
时使 --rerun-tasks
默认
如果您不想修改命令行,这里有一个使用 "build.gradle" 文件的解决方案:
test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}
这是输出。注意与之前的输出相比有 2 处更改:
1) 一个新的 'cleanTest' 任务出现在输出中。
2) 'test' 总是被清理(即从不 'UP-TO-DATE')所以它每次都会被执行:
$ 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
这是最近 Gradle 博客上的主题 post Stop rerunning your tests. The author 显示了一个使用 outputs.upToDateWhen { false }
的示例并解释了错误原因:
This doesn’t actually force reruns
What the author of this snippet probably wanted to say is “Always rerun my tests”. That’s not what this snippet does though. It will only mark the task out-of-date, forcing Gradle to recreate the output. But here’s the thing, if the build cache is enabled, Gradle doesn’t need to run the task to recreate the output. It will find an entry in the cache and unpack the result into the test’s output directory.
The same is true for this snippet:
test.dependsOn cleanTest
Gradle will unpack the test results from the build cache after the output has been cleaned, so nothing will be rerun. In short, these snippets are creating a very expensive no-op.
If you’re now thinking “Okay, I’ll deactivate the cache too”, let me tell you why you shouldn’t.
然后,作者继续解释为什么重新运行一些测试是浪费时间:
The vast majority of your tests should be deterministic, i.e. given the same inputs they should produce the same result.
在少数情况下,您确实希望在代码未更改的情况下重新运行测试,您应该将它们建模为输入。以下是博客 post 中的两个示例,显示添加输入以便任务将在其最新检查期间使用它。
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
我建议阅读整个博客 post。
--rerun-tasks
有效,但效率低下,因为它会重新运行所有任务。
由于构建缓存,cleanTest
本身可能不够。
所以,最好的方法是:
./gradlew --no-build-cache cleanTest test
TL;DR
test.dependsOn cleanTest
None 以上方法对我有用。
对我有用的是简单地从 /Users/<username>/.gradle/caches/build-cache-1/
.
中的缓存目录中删除所有项目
我已经设置了成绩脚本。 当我执行 Gradle 构建时,一切正常,它 运行 是 jUnit 测试。
之后,当我 运行 Gradle 测试时,我得到以下结果:
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
时,然后 Gradle 构建工作,当然......
我希望能够仅重置测试,而不是构建整个项目:我应该怎么做?
一个选项是在 Forcing tasks to execute 部分使用 --rerun-tasks
标志。这将重新运行所有测试任务及其依赖的所有任务。
如果您只对重新运行测试感兴趣,那么另一种选择是让gradle在执行测试之前清理测试结果。这可以使用 cleanTest
任务来完成。
一些背景 - Java 插件为每个其他任务定义了一个干净的任务。根据 Tasks 文档:
cleanTaskName - Deletes files created by specified task. cleanJar will delete the JAR file created by the jar task, and cleanTest will delete the test results created by the test task.
因此,要重新运行 测试,您还需要运行 cleanTest
任务,即:
gradle cleanTest test
gradle test --rerun-tasks
Specifies that any task optimization is ignored.
来源:https://gradle.org/docs/current/userguide/gradle_command_line.html
其他选择是在您的 build.gradle 中添加以下内容:
test.outputs.upToDateWhen {false}
此外,
必须添加 --rerun-tasks
确实是多余的。永远不会发生。创建一个 --no-rerun-tasks
并在 cleanTask
--rerun-tasks
默认
如果您不想修改命令行,这里有一个使用 "build.gradle" 文件的解决方案:
test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}
这是输出。注意与之前的输出相比有 2 处更改:
1) 一个新的 'cleanTest' 任务出现在输出中。
2) 'test' 总是被清理(即从不 'UP-TO-DATE')所以它每次都会被执行:
$ 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
这是最近 Gradle 博客上的主题 post Stop rerunning your tests. The author 显示了一个使用 outputs.upToDateWhen { false }
的示例并解释了错误原因:
This doesn’t actually force reruns
What the author of this snippet probably wanted to say is “Always rerun my tests”. That’s not what this snippet does though. It will only mark the task out-of-date, forcing Gradle to recreate the output. But here’s the thing, if the build cache is enabled, Gradle doesn’t need to run the task to recreate the output. It will find an entry in the cache and unpack the result into the test’s output directory.
The same is true for this snippet:
test.dependsOn cleanTest
Gradle will unpack the test results from the build cache after the output has been cleaned, so nothing will be rerun. In short, these snippets are creating a very expensive no-op.
If you’re now thinking “Okay, I’ll deactivate the cache too”, let me tell you why you shouldn’t.
然后,作者继续解释为什么重新运行一些测试是浪费时间:
The vast majority of your tests should be deterministic, i.e. given the same inputs they should produce the same result.
在少数情况下,您确实希望在代码未更改的情况下重新运行测试,您应该将它们建模为输入。以下是博客 post 中的两个示例,显示添加输入以便任务将在其最新检查期间使用它。
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
我建议阅读整个博客 post。
--rerun-tasks
有效,但效率低下,因为它会重新运行所有任务。
cleanTest
本身可能不够。
所以,最好的方法是:
./gradlew --no-build-cache cleanTest test
TL;DR
test.dependsOn cleanTest
None 以上方法对我有用。
对我有用的是简单地从 /Users/<username>/.gradle/caches/build-cache-1/
.