测试后执行分级任务



在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任务仅在测试套件成功时执行。

最新更新