如何使用Gradle重新运行失败的TestNG测试

时间:2017-03-09 17:04:18

标签: gradle testng

我知道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")
}
}

Aftrer正在运行任务第二次尝试true获得println file("build/reports/tests/test/testng-failed.xml").exists(),但未运行测试失败并跳过任务: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任务,但仍未运行失败的测试。

3 个答案:

答案 0 :(得分:1)

这可以通过TestNG的称为RetryAnalyzer的功能来实现。稍作调整,我们便可以告诉TestNG,在通过测试之前应重试多少次,以及什么样的异常/错误会触发重试失败的测试方法。

答案 1 :(得分:0)

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

这是用Kotlin语言进行的工作示例,此处失败的测试方法将再次运行,直到满足指定条件为止。

RerunTests.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
        }
    }
}

答案 2 :(得分:0)

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
    }
}