step1:新建Java类TestngRetry实现IRetryAnalyzer接口,复写retry方法
IRetryAnalyzer接口作用:实现此接口可以让失败的用例运行重试机制
public class TestngRetry implements IRetryAnalyzer {
private static Logger logger = Logger.getLogger(TestngRetry.class);
// 表示当前所重试的次数
public static int retryCount = 1;
// 表示重试最大次数限制
public int maxRetryCount = 2;
@Override
public boolean retry(ITestResult result) {
// TODO Auto-generated method stub
if (retryCount <= maxRetryCount) {
logger.info("开始重试第" + "【" + retryCount + "】次" );
retryCount++;
// 如果返回为true表示执行重试机制
return true;
}
// 如果返回为false表示不执行重试机制
return false;
}
}
step2:新建Java类RetryListener实现IAnnotationTransformer接口,复写transform方法
IAnnotationTransformer接口作用:在TestNG执行过程中动态修改@Test注解的参数
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor
testConstructor, Method testMethod) {
// TODO Auto-generated method stub
IRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();
if (iRetryAnalyzer == null) {
annotation.setRetryAnalyzer(TestngRetry.class);
}
}
}
step3:在testng.xml配置文件中添加RetryListener监听器即可
<listener class-name="com.lemon.listener.RetryListener"></listener>
引入的问题
在运行重试的机制的时候我们会发现一个问题:
如果有引入dataprovider,那么dataprovider的第二组数据以后的用例失败后是不会正常的运行重试机制的
原因:
TestNG自带BUG,新建类TestResultListener继承于TestListenerAdapter,重写里面的onTestSuccess()和onTestFailure方法,在里面将当前的重试次数给置为1
public class TestResultListener extends TestListenerAdapter{
@Override
public void onTestSuccess(ITestResult tr) {
// TODO Auto-generated method stub
super.onTestSuccess(tr);
System.out.println("当前用例执行成功");
//修复了TestNG的bug:dataprovider和重试机制冲突问题
//用例重试机制有这种情况:当他运行到第一次重试or第二次重试or第三次(没有达到最大的重试次数的时候),有可能执行成功
//用例此时会成功
TestngRetry.currentRetryCount=1;
}
@Override
public void onTestFailure(ITestResult tr) {
// TODO Auto-generated method stub
super.onTestFailure(tr);
System.out.println("当前用例执行失败");
TestngRetry.currentRetryCount=1;
}
@Override
public void onTestSkipped(ITestResult tr) {
// TODO Auto-generated method stub
super.onTestSkipped(tr);
System.out.println("当前用例执行跳过");
}
}