【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() {}
相关推荐
弹简特15 小时前
【精通Postman接口测试】03-结果断言实战 + 数据驱动保姆级教程
测试工具·接口测试·postman·断言
llilian_1616 小时前
失真度测量仪校准 精准可靠的失真度校准检定测试仪筑牢检测根基 失真度检定装置
功能测试·单片机·嵌入式硬件·硬件工程
测试员周周18 小时前
【免费福利】AI测试:测试技能包进阶:造数、压测、视觉回归、CI 全流程串联
开发语言·人工智能·python·功能测试·测试工具·ci/cd·测试用例
qq 137401861121 小时前
ISTA 3L 2023 电商包装安全测试与质量试验全解析
功能测试·安全·可用性测试·安全性测试
PhotonixBay21 小时前
表面粗糙度怎么测才准?ISO 25178标准三维面积测量标准解析
人工智能·测试工具
KK溜了溜了1 天前
wireshark and tcpdump抓包
测试工具·wireshark·tcpdump
智擎软件测评小祺1 天前
功能检测前期准备:夯实检测高效开展的基础
功能测试·cma·第三方检测·cnas·功能检测
老神在在0012 天前
测试方法与使用场景
单元测试·测试
老神在在0012 天前
JSON Schema
测试工具·json
小杍随笔2 天前
【FlyEnv v4.15.0 重磅更新!新增 FrankenPHP、CliProxyAPI、Numa、Rnacos 模块,开发效率再升级】
测试工具·开发环境管理工具