【TestNG】(4) 重试机制与监听器的使用

在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。

在不写代码的情况没有提供可配置方式,需要自己实现TestNG提供的接口,并以监听器的方式提供出来才可使用。

一、结合监听器配置

step1:新建Java类TestngRetry实现IRetryAnalyzer接口,复写retry方法

IRetryAnalyzer接口作用:实现此接口可以让失败的用例运行重试机制

java 复制代码
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注解的参数

java 复制代码
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监听器即可

XML 复制代码
 <listener class-name="com.lemon.listener.RetryListener"></listener>

引入的问题

在运行重试的机制的时候我们会发现一个问题:

如果有引入dataprovider,那么dataprovider的第二组数据以后的用例失败后是不会正常的运行重试机制的

原因:

**TestNG自带BUG,**新建类TestResultListener继承于TestListenerAdapter,重写里面的onTestSuccess()和onTestFailure方法,在里面将当前的重试次数给置为1

java 复制代码
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("当前用例执行跳过");
    } 
}

二、不配置监听器

java 复制代码
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() {}
相关推荐
DJ斯特拉3 小时前
Redis使用lua脚本
junit·单元测试·lua
念越4 小时前
蓝桥杯单元测试模拟1期模拟题答案及代码解析
蓝桥杯·单元测试·测试
Luminbox紫创测控1 天前
太阳光模拟器在汽车智能玻璃的运用
测试工具·汽车
西瓜程序猿1 天前
如何将纸质版礼薄转换为电子礼薄?可以使用记了么
测试工具·创业创新
123过去1 天前
crunch使用教程
linux·测试工具·安全
AIminminHu1 天前
OpenGL渲染与几何内核那点事-项目实践理论补充(三-1-(2):当你的CAD代码变得“又大又乱”:从手动编译到CMake,从随性编码到单元测试))
c++·单元测试·cmake·cad·cad开发
测试_AI_一辰1 天前
Playwright执行原理拆解(测试视角)
人工智能·功能测试·ai编程
独断万古他化1 天前
【抽奖活动管理平台】完整质量测试报告:功能 / 自动化 / 性能三大维度总结
功能测试·自动化·接口测试·测试报告·ui测试
123过去1 天前
samdump2使用教程
linux·测试工具·安全
测试19982 天前
使用Python自动化生成接口测试用例
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试