Re-run failed tests in testng

自动化测试过过程当中,有些testcase会由于各类缘由失败,好比网络问题/服务器问题/数据库问题/系统问题/浏览器问题等等,做为自动化测试者,咱们须要再次执行失败的测试用例,对于testng框架使用者,这里有两种方案来执行失败的用例。数据库

方案一. 使用“testng-failed.xml”来执行失败的测试用例.浏览器

steps: 1. 在第一次执行完自动化测试以后,刷新项目文件夹。服务器

   2. 一个文件夹名为“test-output”自动生成,在该文件夹内,有一个文件是“testng-failed.xm”。网络

   3. Run testng-failed.xml,就会再次执行失败的测试用例。框架

方案二. 经过实现TestNG IRetryAnalyzer接口来执行失败的测试用例ide

新建一个类来实现IRetryAnalyzer,并重写这个接口里面为一个的一个方法 retry测试

public class RetryAnalyzer implements IRetryAnalyzer {

    private int retryCount = 0;
    private static int retryLimit = 3;

    @Override
    public boolean retry(ITestResult result) {
        String testClassName = String.format("%s.%s", result.getMethod().getRealClass().toString(), result.getMethod().getMethodName());

        if(retryCount < retryLimit){
            Log.info("[RETRYING] " + testClassName + " FAILED, "
                    + "Retrying " + (retryCount+1)+ " time", true);
            retryCount ++;
            CurrentManager.putParameter("retryCount", String.valueOf(retryCount));
            return true;
        } else {
            return false;
        }
    }
}

重写完这个retryAnalyzer接口以后,能够在test method上面加上这个类:ui

@Test(retryAnalyzer = RetryAnalyzer.class)
    public void test(){
    Assert.assertEquals(1,2);
  }

而后再执行这个测试的时候,若是测试失败,就会自动retry 3次,从新执行这个测试用例。spa

除了上面这种方法,还能够用一个retryListener,在测试执行期间,就能对全部失败的测试用例re-run。code

public class RetryListener implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
        IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();
        if(retryAnalyzer == null){
            iTestAnnotation.setRetryAnalyzer(RetryAnalyzer.class);
        }
    }
}

这里面用到了接口IAnnotationTransformer,他的方法transformer会在测试运行期间被每个test method调用,这个接口会给每个test method添加annotation。而后在testng.xml file中,添加这个listener:

<listeners>
        <listener class-name="com.stubhub.aroma.platform.controller.RetryListener" />
    </listeners>

执行这个xml file,针对test suite里面全部的测试,失败的test method就会从新被执行。

 

实现了re-run failed case以后,也有另一个问题跟个人需求不符合,从新执行过失败的test method以后,testng给出的test result中,把failed cases标记为了skipped,好比一个test method,执行第一次失败,而后retry 3 次,全都失败,testng给出的result就是Total tests run: 4, Failures: 1, Skips: 3.

一共4次失败,前三次都会被标记为skip,只有最后一次被标记为fail。 对于个人需求,我须要将testng result 展示到report中,我指望的result是 run 1 case, failed 1.  因此我后面在ITestListener的实现类的onTestFailure / onTestSuccess方法中,多加了逻辑来处理多余的skipped case。

@Override
    public void onTestFailure(ITestResult result) {
        if(CurrentManager.getParameter("retryCount") != null){
            ITestNGMethod method = result.getMethod();
            while(!result.getTestContext().getSkippedTests().getResults(method).isEmpty()){
                result.getTestContext().getSkippedTests().removeResult(method);
            }
            }
    }
相关文章
相关标签/搜索