当所有测试都是最新版本时,如何运行Gradle测试?

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

  • 上面的评论是对的。但是如果你使用 `--no-build-cache`,那么它将按预期工作,例如 `gradle cleanTest test --no-build-cache`。 (8认同)
  • ```gradle cleanTest test``` 不会重新运行测试,它会清除它们的输出,但是 ```test``` 任务仍然会从缓存中获取测试结果 - 请参阅 https://github.com/gradle /gradle/问题/9153 (5认同)
  • `--rerun-tasks` 只是门票。即使进行清理,“--no-build-cache”对我来说也不起作用。谢谢@阿姆农 (4认同)
  • 在大型项目中,“--rerun-tasks”是一个坏主意。它从头开始编译所有内容,即使您只想在本地模块中运行快速测试,这也可能需要很长时间。 (3认同)
  • “gradle cleanTest 测试”对我有用。 (2认同)

Fra*_*man 44

其他选项是在build.gradle中添加以下内容:

test.outputs.upToDateWhen {false}
Run Code Online (Sandbox Code Playgroud)

  • 这是一种比接受的答案更好的方法,因为它只适用于所需的任务.`upToDateWhen`可以用于任何"代码驱动"方式,例如系统属性,环境变量,项目属性等. (3认同)
  • 正如答案 /sf/answers/3673898161/ 提到的,有一篇有用的博客文章 https://blog.gradle.org/stop-rerunning-tests 解释了为什么不建议将这种方法作为通用方法。不过,我同意它可能有用并且确实实现了问题所要求的目的。 (3认同)
  • 在 Gradle 7.3+ 中,您可以使用 [`doNotTrackState("测试应该始终运行")`](https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:disable-state-tracking) 来禁用-最新检查。 (3认同)
  • 很好的答案!!!使用参数传递它:`gradle test -Prerun-tests`。build.gradle 中的代码: ```if(project.hasProperty("rerun-tests")) { test.outputs.upToDateWhen {false} } ``` (2认同)

Mar*_*son 18

gradle test --rerun-tasks

指定忽略任何任务优化.

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

  • 我认为它也会重新运行所有相关任务,这不是提问者预期的行为。 (7认同)

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)

  • 在 ```test``` 之前运行 ```cleanTest``` 不会重新运行测试,它会清除它们的输出,但测试任务仍然会从缓存中获取测试结果 - 请参阅 github.com/gradle/gradle/问题/9153 (3认同)

mko*_*bit 10

最近,这是Gradle博客文章停止重新运行测试中的主题。在笔者给出了一个例子使用outputs.upToDateWhen { false },并解释为什么它是错误的:

这实际上并不强制重新运行

该摘录的作者可能想说的是“始终重新运行我的测试”。这不是该代码段的作用。它只会将任务标记为过期,从而迫使Gradle 重新创建输出。但是,如果启用了构建缓存,则Gradle不需要运行任务来重新创建输出。它将在缓存中找到一个条目,并将结果解压缩到测试的输出目录中。

此代码段也是如此:

test.dependsOn cleanTest
Run Code Online (Sandbox Code Playgroud)

清除输出后,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)

我建议阅读整个博客文章。

  • 对于您正在谈论的特定用例,这听起来很棒,但是我正在针对实时的外部Web服务编写部署后测试,并且碰巧正在使用junit和gradle来完成此任务。被测试的代码不在仓库中,并且实际上没有*“应用程序代码”,因为我实际上是在测试一个实时生产系统,而不是代码本身。感谢您的回答,这非常有用!只是想指出,还有一些用例确实需要每次都重新运行测试,即使gradle知道的代码都没有改变 (5认同)
  • 作者缺少测试的基本概念:不确定性行为。如果您怀疑测试是可以的,但代码有一些错误并且使结果不确定,那么,根据这个短视的建议,如果它在第一次运行中碰巧成功,您将永远不会获得堆栈跟踪。测试应该运行您想要的次数。考虑到运行多个测试的不良实践是完全错误的,并且违背了测试概念。 (3认同)

pru*_*nge 5

从 Gradle 7.6 开始,可以使用 gradle test --rerun.

该功能的描述--rerun 位于 Gradle 问题跟踪器中,适用于任何任务(不仅仅是“测试”)。基本上它只是迫使 Gradle 考虑该任务,并且只有该任务不是最新的才会重新运行它。

另请参阅手册中的--rerun

--rerun

Causes the task to be re-run even if up-to-date. Similar to --rerun-tasks, but for a specific task.
Run Code Online (Sandbox Code Playgroud)