USe*_*299 109 java gradle build.gradle
我已经设置了成绩脚本.当我执行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
Run Code Online (Sandbox Code Playgroud)
当我执行时gradle clean,然后Gradle构建工作,当然......我希望能够只重置测试,而不是构建整个项目:我该怎么做?
Amn*_*hot 148
一种选择是--rerun-tasks在命令行中使用该标志.这将重新运行所有测试任务及其依赖的所有任务.
如果您只对重新运行测试感兴趣,那么另一个选择是在执行测试之前使gradle清理测试结果.这可以使用cleanTest任务完成.
一些背景 - Java插件为每个其他任务定义了一个干净的任务.根据文件:
cleanTaskName - 删除由指定任务创建的文件.cleanJar将删除jar任务创建的JAR文件,cleanTest将删除测试任务创建的测试结果.
因此,重新运行测试所需的只是运行cleanTest任务,即:
gradle cleanTest test
Fra*_*man 44
其他选项是在build.gradle中添加以下内容:
test.outputs.upToDateWhen {false}
Run Code Online (Sandbox Code Playgroud)
Mar*_*son 18
gradle test --rerun-tasks
指定忽略任何任务优化.
资料来源:https://gradle.org/docs/current/userguide/gradle_command_line.html
mas*_*c3d 17
--rerun-tasks 工作,但效率低下,因为它重新运行所有任务。
cleanTest 由于构建缓存,它本身可能不够。
因此,实现此目的的最佳方法是:
./gradlew --no-build-cache cleanTest test
Run Code Online (Sandbox Code Playgroud)
Tea*_*eed 12
这是使用"build.gradle"文件的解决方案,以防您不想修改命令行:
test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}
Run Code Online (Sandbox Code Playgroud)
这是输出.请注意以前输出中的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
Run Code Online (Sandbox Code Playgroud)
mko*_*bit 10
最近,这是Gradle博客文章停止重新运行测试中的主题。在笔者给出了一个例子使用outputs.upToDateWhen { false },并解释为什么它是错误的:
这实际上并不强制重新运行
该摘录的作者可能想说的是“始终重新运行我的测试”。这不是该代码段的作用。它只会将任务标记为过期,从而迫使Gradle 重新创建输出。但是,如果启用了构建缓存,则Gradle不需要运行任务来重新创建输出。它将在缓存中找到一个条目,并将结果解压缩到测试的输出目录中。
此代码段也是如此:
Run Code Online (Sandbox Code Playgroud)test.dependsOn cleanTest清除输出后,Gradle将从构建缓存中解压缩测试结果,因此不会重新运行任何内容。简而言之,这些片段造成了非常昂贵的无操作。
如果您现在正在考虑“好的,我也将停用缓存”,那么让我告诉您为什么不应该这样做。
然后,作者继续说明为什么重新运行某些测试会浪费时间:
您的绝大多数测试应该是确定性的,即,在给出相同输入的情况下,它们应该产生相同的结果。
如果您确实想在代码未更改的情况下重新运行测试,则应将它们建模为输入。这是博客文章中的两个示例,它们显示了添加输入,以便任务在最新检查期间使用它。
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
Run Code Online (Sandbox Code Playgroud)
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
Run Code Online (Sandbox Code Playgroud)
我建议阅读整个博客文章。
从 Gradle 7.6 开始,可以使用 gradle test --rerun.
该功能的描述--rerun 位于 Gradle 问题跟踪器中,适用于任何任务(不仅仅是“测试”)。基本上它只是迫使 Gradle 考虑该任务,并且只有该任务不是最新的才会重新运行它。
另请参阅手册中的--rerun。
Run Code Online (Sandbox Code Playgroud)--rerun Causes the task to be re-run even if up-to-date. Similar to --rerun-tasks, but for a specific task.