在Gradle构建中执行test
任务后,我希望始终执行应该可以访问测试结果的附加任务。类似于:
task('afterTest') {
doLast {
if (testSuccessful) {
//
} else {
//
}
}
}
您的问题有两部分:1)使自定义任务始终在执行test
任务之后执行,2)使测试"结果"在此自定义任务中可用。
1) 第一部分非常简单,您只需要使用专用的Task.finalizedBy
方法在test
任务和自定义任务之间创建一个"finalized by"依赖关系。(参见定稿器任务)
2) 第二部分有点棘手,因为据我所知,Gradle没有提供简单的方法来获得test
任务的"结果"(SUCCESS或FAILURE)。但是,您可以使用测试任务公开的API将错误测试的数量存储到变量中,并在自定义任务中测试该计数器:下面是一个工作示例:
ext{
// counter of test cases in error
nbTestOnError = 0
}
test {
// use "afterTest" hook to increment nbTestOnError counter
afterTest { desc , result ->
if (result.getResultType().equals(TestResult.ResultType.FAILURE)){
nbTestOnError++
}
}
}
task('afterTest') {
doLast {
// implement your logic depending on counter value
if (nbTestOnError > 0) {
// do something if test failed
} else{
// do something when all tests passed
}
}
}
// create "finalized by" dependency
test.finalizedBy afterTest
EDIT:基于@lance java注释中的重要注释:为了支持最新检查,如果test
任务未执行,您可以将自定义任务配置为"跳过"。一个简单的方法是使用任务upToDateWhen
功能(请参阅此处):
task('afterTest') {
// consider this task "UP TO DATE" if `test` task did not execute
outputs.upToDateWhen {
!test.didWork
}
doLast {
//...
}
}
正如我在另一个线程中所说,最好使用文件系统将值从一个任务传递到另一个任务。这样,即使测试任务是最新的并被跳过,该值也将可用。例如:
test {
outputs.file "$buildDir/test.properties"
ext.errorCount = 0
afterTest { desc , result ->
if (result.resultType.name() == "FAILURE") {
errorCount++
}
}
doLast {
file("$buildDir/test.properties").text = "errorCount=$errorCount"
}
finalizedBy 'afterTest'
ignoreFailures = true
}
task afterTest {
dependsOn 'test'
inputs.file "$buildDir/test.properties"
doLast {
def props = new Properties()
props.load(file("$buildDir/test.properties"))
def errorCount = Integer.parseInt(props['errorCount'])
if (errorCount) {
// doStuff
throw new TaskExecutionException("$errorCount tests failed")
}
}
}
在现有答案的基础上,使用org.gradle.api.tasks.testing.Test.afterSuite
将测试结果保存到文件中:
test {
afterSuite { descriptor, result ->
if (descriptor.parent == null) {
file("$buildDir/test.result").text = result.resultType
}
}
}
afterTest.onlyIf {
file("$buildDir/test.result").text == 'SUCCESS'
}
其中CCD_ 9任务仅在测试套件成功时执行。