赞
踩
在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。
在不写代码的情况没有提供可配置方式,需要自己实现TestNG提供的接口,并以监听器的方式提供出来才可使用。
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;
- }
- }
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);
- }
- }
- }
<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("当前用例执行跳过");
- }
- }
- public class MyRetry implements IRetryAnalyzer {
- private int retryCount = 0;
- private static final int maxRetryCount = 3;
- @Override
- public boolean retry(ITestResult result) {
- if (retryCount < maxRetryCount) {
- retryCount++;
- return true;
- }
- //如果多个@Test方法中用了该注解,因为testng的bug,它new的是同一个MyRetry对象
- //那么count不清0会报错,因为是一个MyRetry对象,可以人为置为0,但是官网不推荐这么做
- retryCount = 0
- return false;
- }
- }
-
-
- 使用重试:
- //在用例类里面 添加重试属性
-
- @Test(retryAnalyzer = MyRetry.class)
-
- public void failedLogin3() {}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。