电商网站开发报告,网站建设博敏,长春站是火车站还是高铁站,怎样创建网站数据库在UI自动化测试用例执行过程中#xff0c;经常会有很多不确定的因素导致用例执行失败#xff0c;比如网络原因、环境问题等#xff0c;所以我们有必要引入重试机制#xff08;失败重跑#xff09;#xff0c;来提高测试用例成功率。
在不写代码的情况没有提供可配置方式…在UI自动化测试用例执行过程中经常会有很多不确定的因素导致用例执行失败比如网络原因、环境问题等所以我们有必要引入重试机制失败重跑来提高测试用例成功率。
在不写代码的情况没有提供可配置方式需要自己实现TestNG提供的接口并以监听器的方式提供出来才可使用。
一、结合监听器配置
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;Overridepublic boolean retry(ITestResult result) {// TODO Auto-generated method stubif (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 {Overridepublic void transform(ITestAnnotation annotation, Class testClass, ConstructortestConstructor, Method testMethod) {// TODO Auto-generated method stubIRetryAnalyzer iRetryAnalyzer annotation.getRetryAnalyzer();if (iRetryAnalyzer null) {annotation.setRetryAnalyzer(TestngRetry.class);} }
}
step3在testng.xml配置文件中添加RetryListener监听器即可 listener class-namecom.lemon.listener.RetryListener/listener
引入的问题
在运行重试的机制的时候我们会发现一个问题
如果有引入dataprovider那么dataprovider的第二组数据以后的用例失败后是不会正常的运行重试机制的
原因
TestNG自带BUG新建类TestResultListener继承于TestListenerAdapter重写里面的onTestSuccess()和onTestFailure方法在里面将当前的重试次数给置为1
public class TestResultListener extends TestListenerAdapter{Overridepublic void onTestSuccess(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSuccess(tr);System.out.println(当前用例执行成功);//修复了TestNG的bugdataprovider和重试机制冲突问题//用例重试机制有这种情况当他运行到第一次重试or第二次重试or第三次没有达到最大的重试次数的时候有可能执行成功//用例此时会成功TestngRetry.currentRetryCount1; }Overridepublic void onTestFailure(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestFailure(tr);System.out.println(当前用例执行失败);TestngRetry.currentRetryCount1; }Overridepublic void onTestSkipped(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSkipped(tr);System.out.println(当前用例执行跳过);}
} 二、不配置监听器
public class MyRetry implements IRetryAnalyzer {private int retryCount 0;private static final int maxRetryCount 3;Overridepublic boolean retry(ITestResult result) {if (retryCount maxRetryCount) {retryCount;return true;}//如果多个Test方法中用了该注解因为testng的bug它new的是同一个MyRetry对象//那么count不清0会报错因为是一个MyRetry对象可以人为置为0但是官网不推荐这么做retryCount 0return false;}
}使用重试
//在用例类里面 添加重试属性Test(retryAnalyzer MyRetry.class)public void failedLogin3() {}