当前位置: 首页 > 知识库问答 >
问题:

重试逻辑-如果一个测试失败,则重试整个类-selenium

罗安和
2023-03-14

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

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被执行并通过第二次测试依赖于firsttest并被执行,其失败-重试3次并再次失败第三次测试跳过,因为它依赖于第二次测试。

产量达到预期。

问:因为测试是依赖的,如果其中一个测试失败,我想先执行整个类,有办法吗?

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

谢谢

共有1个答案

慕承恩
2023-03-14

目前没有办法实现你的要求。

TestNG只会重试失败的测试,但不会在执行阶梯上找出所有上游依赖项并尝试运行它们(您的ask是这个通用用例的一个非常具体的变体)。

如果你仔细想想,一个依赖测试的执行仅仅是因为它的上游依赖项(它所依赖的方法)已经成功执行。那么,如果当前测试失败,为什么需要重新执行已经满足的上游依赖关系呢?这是违反直觉的。

对于您所拥有的用例,您应该只在@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注释(在该接口的javadocs中明确调用)将IANotationTransformer侦听器连接起来。只能通过

 类似资料:
  • 问题内容: 我正在编写一些重新连接逻辑,以定期尝试建立与发生故障的远程端点的连接。本质上,代码如下所示: 我已经在很多情况下使用类似于上面的代码解决了这个普遍的问题,但是我对结果不满意。是否有设计用于解决此问题的设计模式? 问题答案: 值得结帐的一个库是Sarge,它会根据已定义的计划自动执行重试。

  • 我们使用的是spring-kafka-2.2.8.release。我有一个需要帮助的具体情况。我有4个主题topic、retryTopic、Successstopic和ErrorTopic。如果topic失败,则应该重定向到retryTopic,在那里将进行3次重试尝试。如果这些尝试失败,则必须重定向到ErrorTopic。如果在topic和retryTopic上都有sucess,则应该重定向到s

  • 问题内容: 我正在使用Jenkins,Python,Selenium2(webdriver)和Py.test框架为网络测试创建测试用例。 到目前为止,我正在按照以下结构组织测试: 每个 类 是 测试用例 ,每个 方法是一个 测试步骤 。 当一切正常时,此设置非常有用,但是当一个步骤崩溃时,其余的“测试步骤”就会发疯。我可以借助来将故障包含在类(测试用例)中,但是我正在研究如何改进它。 我需要的是,

  • 碰到一个问题是这样的,有个老项目,用的jquery进行发送请求,因为环境网络不稳定之类的,会有偶然性的请求失败,SSL连接失败,没有状态码,只要重新发送就能正常了。所以期望能做到如果请求响应失败,且没有状态码时,请求能否每隔半秒自动重试3次。如下代码,在重试期间fail、error、always等回调逻辑不会被触发。 试过使用 $.ajaxPrefilter 和 $.ajaxSetup 对erro

  • 我写了500多个单元测试方法。当我发出< code>ng test命令时。它开始测试所有的500种方法。 如果任何测试用例失败,它不会停止,仍然会继续执行所有方法。所以我需要等待更多的时间来再次重新运行单元测试。 我知道我们可以通过执行来存在,然后使用命令再次重新运行单元测试。这种方式也需要太多时间。 那么,如果任何一个测试失败,是否有可能停止(不存在)单元测试?

  • 我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,