为什么我的Gradle测试反复运行?

时间:2012-09-28 10:45:49

标签: gradle

我有一个非常标准的Gradle构建,正在构建一个Java项目。

当我第一次运行它时,它会编译所有内容并运行测试。当我第二次运行它而不更改任何文件时,它会再次运行测试。

根据this thread,如果没有任何改变,Gradle应该是defaut的懒惰而不打扰运行测试。此处的默认行为是否已更改?

编辑:

如果我反复运行gradle test,测试只会在第一次运行,然后会被跳过。但是,如果我反复运行gradle build,则每次都会重新运行测试,即使所有其他任务都标记为最新。

3 个答案:

答案 0 :(得分:2)

gradle uptodate检查在信息级别上记录为什么任务不被认为是最新的。请重新运行“gradle build -i”以在检查日志输出时使用info logging运行。

欢呼声, 勒

答案 1 :(得分:2)

好的,所以我得到了答案,感谢Rene提示我查看'-i'输出......

我实际上有两个测试任务:来自Java插件的'test'和我自己的'integrationTest'测试任务。我没有在问题中提到这一点,因为我认为这不相关。

事实证明,这些任务正在将输出(报告等)写入同一目录,因此Gradle的基于任务的输入和输出跟踪认为某些内容已发生变化,并重新运行测试。

所以下一个问题(我将分别提出)成为:我如何干净地(并使用最小的Groovy / Gradle代码)完全分离测试任务的两个实例。

答案 2 :(得分:0)

您需要在build.gradle中创建测试任务,然后调用这些特定任务来运行一组特定的测试。下面是一个示例,它将过滤掉类,以便它们不会运行两次(例如运行套件然后独立地重新运行其子类):

tasks.withType(Test) {
    jvmArgs '-Xms128m', '-Xmx1024m', '-XX:MaxPermSize=128m'
    maxParallelForks = 4  // this runs tests parallel if more than one class
    testLogging {
        exceptionFormat "full"
        events "started", "passed", "skipped", "failed", "standardOut", "standardError"
        displayGranularity = 0
    }   
}
task runAllTests(type: Test) {
    include '**/AllTests.class'
    testReportDir = file("${reporting.baseDir}/AllTests")
    testResultsDir = file("${buildDir}/test-results/AllTests")
}
task runSkipSuite(type: Test) {
    include '**/Test*.class'
    testReportDir = file("${reporting.baseDir}/Tests")
    testResultsDir = file("${buildDir}/test-results/Tests")
}

另外,关于你的构建问题。 “构建”任务包括一个清理步骤,即从构建目录中清除测试。否则执行认为测试已经运行。