2

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

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

根据这个线程,Gradle 应该默认是懒惰的,如果没有任何变化,也不会打扰运行测试。此处的默认行为是否已更改?

编辑:

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

4

3 回答 3

2

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

干杯,勒内

于 2012-09-28T12:19:52.523 回答
2

好的,多亏了 Rene 提示我查看“-i”输出,我得到了答案……

我实际上有 2 个测试任务:来自 Java 插件的“测试”任务,以及我自己的“集成测试”任务。我没有在问题中提到这一点,因为我认为这无关紧要。

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

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

于 2012-10-01T13:36:33.267 回答
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")
}

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

于 2013-02-26T15:55:49.820 回答