测试后执行gradle任务

anl*_*lar 2 gradle

test在Gradle build中执行任务后,我希望始终执行应该可以访问测试结果的其他任务。就像是:

task('afterTest') {
    doLast {
        if (testSuccessful) {
            //
        } else {
            //
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

M.R*_*uti 5

您的问题有两个部分:1)使任务始终在test执行任务后执行,2)使测试“结果”在此任务中可用。

1)第一部分非常简单,您只需要使用专用Task.finalizedBy方法在test任务和自定义任务之间创建“ finalized by”依赖项即可。(请参阅终结器任务

2)第二部分有些棘手,因为据我所知,Gradle没有提供简单的方法来获得任务的“结果”(成功或失败)test。但是您可以使用测试任务公开的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
Run Code Online (Sandbox Code Playgroud)

编辑:基于@ lance-java的注释中的重要说明:为了支持 最新检查,可以将自定义任务配置为“跳过”(如果test未执行任务)。一种简单的方法是使用Task upToDateWhen功能(请参阅此处):

task('afterTest') {
    // consider this task "UP TO DATE" if `test` task did not execute
    outputs.upToDateWhen {
        !test.didWork
    }
    doLast {
    //...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我个人将结果作为JSON / XML /属性文件写入磁盘,而不是使用`ext.nbTestOnError`。然后,您可以将该文件用作“ afterTest”任务的输入。这意味着Gradle的最新检查/跳过可以继续进行。 (2认同)