selenium - 重试逻辑 - 如果一个测试失败,重试整个班级 - selenium
问题描述
以下是用于实现重试逻辑的类
测试重试类:
public class TestRetry implements IRetryAnalyzer {
int counter=0;
int retryLimit=2;
@Override
public boolean retry(ITestResult result) {
if (counter < retryLimit) {
TestReporter.logStep("Retrying Test " +result.getName()+" for number of times: "+(counter+1));
counter++;
return true;
}
return false;
}
重试监听类:
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
// TODO Auto-generated method stub
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(TestRetry.class);
}
}}
样品测试:
@Listeners(RetryListener.class)
public class SampleTest {
@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
method.setRetryAnalyzer(new TestRetry());
}
}
@Test(priority=0)
public void firsttest() {
System.out.println();
TestReporter.assertEquals("Test", "Test", "pass");
}
@Test(priority=1, dependsOnMethods="firsttest")
public void secondtest() {
TestReporter.assertEquals("Test", "Test1", "fail");
}
@Test(priority=2,dependsOnMethods="secondtest")
public void thirdtest() {
TestReporter.assertEquals("Test", "Test", "pass");
}
}
当我执行上述测试时,以下是输出 firsttest 被执行并通过 secondtest 依赖于 firsttest 并被执行,它失败 - 重试 3 次并再次失败,因为它取决于 secondtest,所以跳过了第三次测试。
产出达到预期。
问题:因为测试是依赖的。如果其中一个测试失败,我想从头开始执行整个课程。有办法吗?
示例:如果 secondtest 失败,我想再次执行整个类 SampleTest。
谢谢!
解决方案
目前没有办法实现您的要求。
TestNG 只会重试失败的测试,但不会爬上执行阶梯来找出所有上游依赖项并尝试运行它们(您的问题是这个通用用例的一个非常具体的变体)。
如果你仔细想想,一个依赖测试之所以被执行,只是因为它的上游依赖(它所依赖的方法)已经成功执行。那么如果当前测试失败了,为什么还要重新执行已经满足的上游依赖呢?它的反直觉。
对于您所拥有的用例,您应该只是在一个@Test
方法中构建整个逻辑,其中您负责处理重试以及在出现故障时再次调用整个链。
下面的示例应阐明
public class SampleTest {
@Test (retryAnalyzer = TestRetry.class)
public void orchestrateTest() {
firsttest();
secondtest();
thirdtest();
}
public void firsttest() {
System.out.println();
TestReporter.assertEquals("Test", "Test", "pass");
}
public void secondtest() {
TestReporter.assertEquals("Test", "Test1", "fail");
}
public void thirdtest() {
TestReporter.assertEquals("Test", "Test", "pass");
}
}
TestNG 不支持您在问题中寻找的用例。
附带说明一下,您不能通过注释IAnnotationTransformer
连接侦听@Listeners
器(这在此接口的 javadocs 中明确调用)。它只能通过<listeners>
套件 xml 中的标签(或)通过在文件中引用它来连接(在 Java 中META-INF\services\org.testng.ITestNGListener
称为服务提供者接口方法)
推荐阅读
- javascript - jQuery 输入字段 .val() 未定义
- recursion - 如果列表中的所有数字都相同,我将如何在 Racket 中编写一个函数,该函数生成 true,否则为 false?
- sql - 求一个月内的平均 id
- c - 如果不存在写权限,为什么需要删除检查
- reactjs - 如何使用 useState 有条件地渲染?
- if-statement - 基于 if 语句的 Power Bi-DAX Measure-Index Match
- matplotlib - Matplotlib 根据 loc 参数而不是 bbox 调整 inset_axes?
- python - 无法完全禁用 python linting Pylance VSCODE
- r - cur_group_id () 在分组数据上未被识别为 dplyr 的函数
- python - 有没有办法让这段代码仍然每行打印一个单词但没有 for 循环?