【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() {}
相关推荐
专业机床数据采集1 小时前
基于 Wireshark 抓包逆向设备通信协议,并用 C# UDP协议跨平台 实现宝元数控程序列表读取、上传、下载和删除
网络·测试工具·wireshark·程序传输·宝元数控·dnc·数控程序传输
糖果店的幽灵2 小时前
软件测试接口测试从入门到精通:Python接口自动化 - pytest测试框架
软件测试·python·功能测试·自动化·pytest·接口测试
程序员龙叔2 小时前
从 0 开始学习 AI 测试 - 从接口测试来教你如何用 AI 来生成自动化测试代码
自动化测试·软件测试·python·软件测试工程师·测试工具·性能测试·ai测试
Saniffer_SH2 小时前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
天天爱吃肉82184 小时前
豆包 vs DeepSeek API 对比分析报告
android·java·大数据·开发语言·功能测试·嵌入式硬件·汽车
川石课堂软件测试5 小时前
APP自动化测试|高级手势操作&toast操作
css·功能测试·测试工具·microsoft·fiddler·单元测试·harmonyos
糖果店的幽灵5 小时前
软件测试接口测试从入门到精通:Python接口自动化 - requests库
开发语言·软件测试·python·功能测试·自动化·接口测试
LT10157974447 小时前
2026年开源自动化测试工具选型指南:功能与适用场景解析
测试工具·开源·自动化
大叔带刺1 天前
AutoSAR SomeIP配置开发速成_02测试工具开发
测试工具·someip
糖果店的幽灵1 天前
软件测试接口测试从入门到精通:其他接口测试工具
软件测试·测试工具·接口测试·apifox·insomnia