我有一个非常标准的 Gradle 构建,它正在构建一个 Java 项目。
当我第一次运行它时,它会编译所有内容并运行测试。当我第二次运行它而不更改任何文件时,它会再次运行测试。
根据这个线程,Gradle 应该默认是懒惰的,如果没有任何变化,也不会打扰运行测试。此处的默认行为是否已更改?
编辑:
如果我gradle test
重复运行,测试只运行第一次,随后被跳过。但是,如果我gradle build
重复运行,测试每次都会重新运行,即使所有其他任务都标记为最新。
gradle uptodate 检查在信息级别上记录为什么任务不被认为是最新的。请重新运行“gradle build -i”以在检查日志输出时使用信息日志运行。
干杯,勒内
好的,多亏了 Rene 提示我查看“-i”输出,我得到了答案……
我实际上有 2 个测试任务:来自 Java 插件的“测试”任务,以及我自己的“集成测试”任务。我没有在问题中提到这一点,因为我认为这无关紧要。
事实证明,这些任务正在将它们的输出(报告等)写入同一个目录,因此 Gradle 的基于任务的输入和输出跟踪认为某些事情发生了变化,并重新运行测试。
所以下一个问题(我将单独问)变成:我如何干净地(并且使用最少的 Groovy/Gradle 代码)完全分离测试任务的两个实例。
您需要在 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")
}
另外,关于您的构建问题。“构建”任务包括一个清理步骤,即清理构建目录中的测试。否则执行认为测试已经运行。