我有 2 个 testng.xml 文件,分别称为 testng_smoke.xml 和 testng_regression.xml。我已如下配置 pom.xml 来运行这些 testng 文件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng_smoke.xml</suiteXmlFile>
<suiteXmlFile>src/test/resources/testng_regression.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
在这里它执行两个 testng 文件并在最后给出构建的状态(成功或失败)。
但我的要求是首先运行冒烟测试套件(testng_smoke.xml),如果冒烟测试套件中存在任何测试失败,则使构建失败,而不移至回归测试套件(testng_regression.xml)。有没有可能达到这个要求。
据我所知,testng 中没有现成的方法可以做到这一点。
如果您使用 Jenkins 或某些 CI,那么最好创建两个作业或管道,以便第二个任务依赖于第一个任务的结果。
如果没有,并且您想使用单个文件,那么可能的解决方案之一可能是将变量维护为文件或环境变量,该变量的值可以在 suiteListener afterSuite 方法中设置。然后,beforeSuite 方法可以抛出 SkipException 以根据变量值忽略套件。
您可以轻松地自己实现这样的行为:
Smoke
将Test标记为烟雾onTestFailure
方法
2.1) 检查结果类注释是否包含“Smoke”并将全局变量smokeFailure
设置为true
BeforeClass
方法中添加 SkipException 抛出,如果 SmokeFailure 设置为 true
这是 Kotlin 代码示例:
class SmokeTestListener : ITestListener {
override fun onTestFailure(result: ITestResult) {
result.testClass.realClass.kotlin.findAnnotation<Smoke>()?.let {
smokeTestFailure = true
}
}
override fun onTestSkipped(p0: ITestResult?) {
}
override fun onTestFailedButWithinSuccessPercentage(p0: ITestResult?) {
}
override fun onStart(p0: ITestContext?) {
}
override fun onFinish(p0: ITestContext?) {
}
override fun onTestStart(p0: ITestResult?) {
}
override fun onTestSuccess(p0: ITestResult?) {
}
companion object {
var smokeTestFailure = false
}
}
@Listeners(SmokeTestListener::class)
open class BaseTestCase {
@BeforeClass
fun checkSmokeTests() {
if(SmokeTestListener.smokeTestFailure) {
throw SkipException("Smoke tests fails")
}
}
}
@Smoke
class SmokeTest : BaseTestCase() {
@Test
fun checkServiceAlive() {
//implementation of smoke test
}
}
class SomeOtherTest : BaseTestCase() {
@Test
fun checkSomthingElse() {
}
}