测试后执行gradle任务

时间:2018-12-28 19:57:05

标签: gradle

在Gradle构建中执行test任务后,我想始终执行应该可以访问测试结果的其他任务。像这样:

task('afterTest') {
    doLast {
        if (testSuccessful) {
            //
        } else {
            //
        }
    }
}

3 个答案:

答案 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 任务。