我知道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
任务,但仍未运行失败的测试。
答案 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
}
}