我有一个非常标准的Gradle构建,正在构建一个Java项目。
当我第一次运行它时,它会编译所有内容并运行测试。当我第二次运行它而不更改任何文件时,它会再次运行测试。
根据this thread,如果没有任何改变,Gradle应该是defaut的懒惰而不打扰运行测试。此处的默认行为是否已更改?
编辑:
如果我反复运行gradle test
,测试只会在第一次运行,然后会被跳过。但是,如果我反复运行gradle build
,则每次都会重新运行测试,即使所有其他任务都标记为最新。
答案 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")
}
另外,关于你的构建问题。 “构建”任务包括一个清理步骤,即从构建目录中清除测试。否则执行认为测试已经运行。