首页 文章

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

提问于
浏览
79

我已经设置了成绩脚本 . 当我执行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构建工作,当然...我希望能够只重置测试,而不是构建整个项目:我该怎么做?

7 回答

  • 15

    一种选择是使用command line中的 --rerun-tasks 标志 . 这将重新运行所有测试任务及其依赖的所有任务 .

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

    一些背景--Java插件为每个其他任务定义了一个干净的任务 . 根据documentation

    cleanTaskName - 删除由指定任务创建的文件 . cleanJar将删除jar任务创建的JAR文件,cleanTest将删除测试任务创建的测试结果 .

    因此,为了重新运行测试,您所需要的只是运行 cleanTest 任务,即:
    gradle cleanTest test

  • 113

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

    test.outputs.upToDateWhen {false}
    
  • -1

    gradle test --rerun-tasks

    指定忽略任何任务优化 .

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

  • 12

    这是使用“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
    
  • 1

    此外,必须添加 --rerun-tasks 实际上是多余的 . 永远不会发生 cleanTask 创建 --no-rerun-tasks 并使 --rerun-tasks 默认为 cleanTask

  • 1

    这是最近关于Gradle的博客文章Stop rerunning your tests的主题 . author显示了一个使用 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()
    }
    

    我建议阅读整篇博文 .

  • 25

    我认为这是一个有效的问题,因为在Gradle中可以运行这个命令 test ,会发生什么事情都没有发生!

    但我会质疑是否有必要这样做,正如Jolta在他的评论中所说:如果没有代码改变,你为什么需要重新测试?如果您对第三方输入有疑问,我会说您需要在应用程序代码中满足此要求 . 如果您担心您的代码可能“片状”,即能够第一次通过所有测试而不是第二次(或第100次),那么您是否需要考虑为什么会遇到这些疑问并解决它们?

    我个人认为这是Gradle中的一个(非常小的)设计错误:如果一切都是最新的,而不是“ Build 成功”,它应该说“自上一次成功 Build 以来没有改变:没有做过” .

相关问题