【问题标题】:Retry Logic - retry whole class if one tests fails - selenium重试逻辑 - 如果一个测试失败,重试整个班级 - selenium
【发布时间】:2023-03-07 05:22:03
【问题描述】:

以下是用于实现重试逻辑的类

TestRetry 类:

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

RetryListener 类:

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 次并再次失败 跳过了thirdtest,因为它依赖于secondtest。

按预期实现输出。

问题: 由于测试是依赖的。如果其中一个测试失败,我想从头开始执行整个课程。有什么办法吗?

示例: 如果 secondtest 失败,我想再次执行整个类 SampleTest。

谢谢!

【问题讨论】:

    标签: selenium testng retry-logic


    【解决方案1】:

    目前无法实现您的要求。

    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 不支持您在问题中寻找的用例。

    附带说明,您不能通过@Listeners 注释连接IAnnotationTransformer 侦听器(此接口的javadocs 中明确指出了这一点)。它只能通过套件 xml 中的 &lt;listeners&gt; 标记连接(或)通过在 META-INF\services\org.testng.ITestNGListener 文件中引用它(在 Java 中称为 Service Provider Interface 方法)

    【讨论】:

    • 感谢您的建议,真的很有帮助。
    • @user9586244 - 如果有帮助请接受我的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多