【问题标题】:Unable to run the failed test cases using IRetryAnalyzer无法使用 IRetryAnalyzer 运行失败的测试用例
【发布时间】:2020-05-06 14:54:11
【问题描述】:

我有一个纯数据驱动的测试用例。我的目标是重新运行至少再次失败的测试。我在这里面临的问题是,如果重试计数设置为 3,并且我有以下方式的数据驱动测试,

    @Test(dataProvider="PositiveScenarios",groups= "smoke",retryAnalyzer = utils.Retry.class)
    public void positiveScenariosTest(LinkedHashMap<String, String> data) throws InterruptedException {
    }

And the Retry class is like below

    package utils;

    import org.testng.IRetryAnalyzer;
    import org.testng.ITestResult;

    public class Retry  implements IRetryAnalyzer{

    int counter = 1;
    int retryMaxLimit = 3;

     public boolean retry(ITestResult result) {
    if (counter < retryMaxLimit) {
            System.out.println("Going to retry test case: " + result.getMethod() + ", " + (retryMaxLimit - counter + 1) + " out of " + retryMaxLimit);
            counter++;
            return true;
        }
        return false;
    }
}

假设我有 10 个测试。如果第 4 次测试失败,则第 4 次测试重试 3 次(这很好)。 在此之后,如果第 6 次测试失败,则第 6 次测试只运行一次,而不是 3 次。 我期待第 6 次测试在失败前运行 3 次。

不确定我在这里做错了什么。

我在这里没有任何特定的 TestNG 侦听器(例如测试失败) 我需要一个吗?如果是这样,第一次测试失败是如何运行 3 次的?是否有我缺少的初始化程序。

非常感谢任何帮助。我正在使用最新版本的 TestNG。

【问题讨论】:

    标签: java selenium testng testng-dataprovider


    【解决方案1】:

    我相信@Override 注释在您的Retry 类中的retry(ITestResult result) 方法上方丢失。
    应该是这样的:

    package utils;
    
    import org.testng.IRetryAnalyzer;
    import org.testng.ITestResult;
    
    public class Retry  implements IRetryAnalyzer{
    
    int counter = 1;
    int retryMaxLimit = 3;
    
    @Override
    public boolean retry(ITestResult result) {
    if (counter < retryMaxLimit) {
           System.out.println("Going to retry test case: " + result.getMethod() + ", " + (retryMaxLimit - counter + 1) + " out of " + retryMaxLimit);
           counter++;
           return true;
           }
       return false;
       }
    }
    

    【讨论】:

    • 非常感谢您的建议。我试过了。它没有帮助
    【解决方案2】:

    我终于知道了。不确定这是否是 TestNG 问题。 我所做的是每次测试通过时(即使在第二轮或第三轮之后)重置计数器,如下所示

    @AfterMethod(alwaysRun = true)
        public void AfterTest(ITestResult result) throws IOException {
        if(result.getStatus() == ITestResult.FAILURE) {         
    
        }
        else if(result.getStatus() == ITestResult.SUCCESS) {
    
            Retry retry = new Retry();
            retry.resetCounter();
        }       
        else if(result.getStatus() == ITestResult.SKIP) {         
        }
    
        }
    

    希望这对某些人有用。再次感谢。这似乎是一个 hack,但有效。

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多