Gradle 测试后执行梯度任务

Gradle 测试后执行梯度任务,gradle,Gradle,在Gradle build中执行test任务后,我希望始终执行应该可以访问测试结果的附加任务。比如: task('afterTest') { doLast { if (testSuccessful) { // } else { // } } } 您的问题分为两部分:1)使自定义任务始终在执行test任务后执行,2)使测试“结果”在此自定义任务中可用 1) 第一部分非常简单,您只需使用

在Gradle build中执行
test
任务后,我希望始终执行应该可以访问测试结果的附加任务。比如:

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

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

1) 第一部分非常简单,您只需使用专用的
任务.finalizedBy
方法在
测试任务和自定义任务之间创建“finalizedBy”依赖关系。(见附件)

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
编辑:根据@lance java:评论中的重要评论,为了支持最新检查,如果未执行
测试
任务,您可以将自定义任务配置为“跳过”。一种简单的方法是使用Task
UpdateWhen
功能(请参阅):


正如我在另一个线程中所说的,最好使用文件系统将值从一个任务传递到另一个任务。这样,即使测试任务是最新的且已跳过,该值也将可用。例如:

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") 
        } 
    } 
} 
基于,用于将测试结果保存到文件:

test {
  afterSuite { descriptor, result ->
    if (descriptor.parent == null) {
      file("$buildDir/test.result").text = result.resultType
    }
  }
}

afterTest.onlyIf {
  file("$buildDir/test.result").text == 'SUCCESS'
}

其中,
后测试
任务仅在测试套件成功时执行。

我个人会将结果作为JSON/XML/属性文件写入磁盘,而不是使用
ext.nbTestOnError
。然后,您可以使用该文件作为
postest
任务的输入。这意味着Gradle的最新检查/跳过操作可以继续工作。@lance java感谢您的评论。我相应地更新了我的答案,使用另一种方法来实现最新的检查,我认为这更简单。如果您看到此解决方案中的一些缺点,请发表评论。您的更改不是我所说的。你不能依赖Gradle模型中的变量。您必须使用文件系统在任务之间正确传递输出/输入扫描您提供了一些有关如何从
test
任务生成此文件的提示吗?我认为添加一个
doLast
块是不可能的,因为它不会在一个测试用例失败时立即执行。我已经创建了一个答案,详细说明了我所说的内容。我在上一篇评论中说过,如果有一个或多个测试失败,Gradle将不会执行“测试”任务的“doLast”块中给出的操作,因此,在这种情况下不会创建/更新文件。这就是我通过测试这个解决方案所观察到的。您是否成功使此解决方案工作?已更新为设置
test.ignoreFailures=true
。看“无知的失败”是有风险的我认为。。。如果重建因测试而失败的项目,“测试”任务将不会再次执行,生成将成功。不确定这是我们想要的。当
errorCount>0
时,您可以在
afterTest
中抛出异常,您将获得所需的行为
test {
  afterSuite { descriptor, result ->
    if (descriptor.parent == null) {
      file("$buildDir/test.result").text = result.resultType
    }
  }
}

afterTest.onlyIf {
  file("$buildDir/test.result").text == 'SUCCESS'
}