【问题标题】:How to re-run failed TestNG tests using Gradle如何使用 Gradle 重新运行失败的 TestNG 测试
【发布时间】:2017-03-09 17:04:17
【问题描述】:

我知道 TestNG 生成 testng-failed.xml 的内容,其中包含有关失败测试的信息。 我想在 Gradle 中使用它来创建运行失败测试的新任务:

task secondTry(type: Test) {
onlyIf {
    file("build/reports/tests/test/testng-failed.xml").exists()
}
println file("build/reports/tests/test/testng-failed.xml").exists()

testClassesDir = sourceSets.test.output.classesDir
classpath = sourceSets.test.runtimeClasspath

useTestNG() {
    suites("build/reports/tests/test/testng-failed.xml")
}
}

在第二次运行任务后尝试我为println file("build/reports/tests/test/testng-failed.xml").exists() 获得了true,但未运行失败的测试并跳过任务:secondTry SKIPPED

有没有人遇到过这种情况,如何让测试运行?

更新: 我尝试稍微修改一下任务,所以只需运行 testng-failed.xml:

task secondTry(type: Test) {
useTestNG() {
    useDefaultListeners = true
    reports.html.enabled = false
    options.suites("build/reports/tests/test/testng-failed.xml")
}
}

结果,构建成功执行,包括secondTry任务,但失败的测试仍然没有运行。

【问题讨论】:

  • 您是否有特殊原因要使用 gradle 来执行此操作?使用 testNG 侦听器有更简单的方法

标签: gradle testng


【解决方案1】:

这可以通过名为 RetryAnalyzer 的 TestNG 功能来实现。通过一些小的调整,我们可以告诉 TestNG 一个测试应该重试多少次直到它通过,以及什么样的异常/错误会触发失败的测试方法的重试。

【讨论】:

    【解决方案2】:

    在 TestNG 中执行此操作的惯用方式是在 IRetryAnalyzer 接口中实现 retry 方法,然后注释所需的测试方法或您希望出现的易碎测试的类。TestNG 将作为一部分自动再次运行它们你的测试套件。这个可以参考TestNG docs

    这是 Kotlin 语言的一个工作示例,失败的测试方法将在此处再次运行,直到它们满足指定的条件。

    重新运行测试.kt

    import framework.core.retry.FailureRunner
    import org.testng.Assert
    import org.testng.annotations.Test
    
    
    @Test(groups = ["rerun"], retryAnalyzer = FailureRunner::class)
    class RerunTests {
        fun foobar() {
            Assert.assertFalse(true)
        }
    
        fun foo() {
            Assert.assertEquals(2, 2)
        }
    }
    

    这是一个实现所需接口的类的示例实现

    FailureRunner.kt

    import org.testng.IRetryAnalyzer
    import org.testng.ITestResult
    import org.testng.Reporter
    
    class FailureRunner : IRetryAnalyzer {
        private var retryCounter = 0
        private var maxRetryCount = System.getProperty("maxFailureRetries").toInt()
    
        override fun retry(result: ITestResult?): Boolean {
            val testName = result?.testName
            return if (retryCounter < maxRetryCount) {
                Reporter.log("Current retry count <$retryCounter> is less than the max no of failure retries <$maxRetryCount>")
                Reporter.log("Retrying $testName")
                ++retryCounter
                true
            } else {
                Reporter.log("Retry count exceeded max limit for $testName.")
                false
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      Test Retry Gradle 插件旨在重试失败的测试,并适用于 TestNG、JUnit 4 & 5 和 Spock。它将重新运行每个失败的测试一定次数,如果总体上发生了太多失败,则可以选择使构建失败。

      plugins {
          id 'org.gradle.test-retry' version '1.2.1'
      }
      
      test {
          retry {
              maxRetries = 3
              maxFailures = 20 // Optional attribute
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-26
        • 1970-01-01
        • 2021-07-13
        • 2019-10-06
        • 1970-01-01
        • 2015-12-28
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多