在Gradle构建中执行test
任务后,我想始终执行应该可以访问测试结果的其他任务。像这样:
task('afterTest') {
doLast {
if (testSuccessful) {
//
} else {
//
}
}
}
答案 0 :(得分:3)
您的问题有两个部分:1)使自定义任务始终在执行test
任务后执行,2)使测试“结果”在此自定义任务中可用。
1)第一部分非常简单,您只需要使用专用的Task.finalizedBy
方法在test
任务和您的自定义任务之间创建一个“ finalized by”依赖项。 (请参阅Finalizer tasks)
2)第二部分有些棘手,据我所知,Gradle没有提供简单的方法来获得test
任务的“结果”(成功或失败)。但是您可以使用Test Task公开的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
编辑:基于@ lance-java注释中的重要说明:为了支持最新检查,您可以将自定义任务配置为如果未执行test
任务,则“跳过”。一种简单的方法是使用任务upToDateWhen
功能(请参阅here):
task('afterTest') {
// consider this task "UP TO DATE" if `test` task did not execute
outputs.upToDateWhen {
!test.didWork
}
doLast {
//...
}
}
答案 1 :(得分:0)
正如我在另一个线程中所说,最好使用文件系统将值从一个任务传递到另一个任务。这样,即使测试任务是最新的并且已被跳过,该值仍然可用。例如:
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")
}
}
}
答案 2 :(得分:0)
基于 existing answers,使用 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'
}
只有在测试套件成功时才会执行 afterTest
任务。