【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() {}
相关推荐
我的xiaodoujiao8 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 22--数据驱动--参数化处理 Json 文件
python·学习·测试工具·pytest
安冬的码畜日常9 小时前
【JUnit实战3_23】 第十四章:JUnit 5 扩展模型(Extension API)实战(上)
测试工具·junit·单元测试·jdbc·h2·extension模型·junit5扩展
安冬的码畜日常19 小时前
【JUnit实战3_22】 第十三章:用 JUnit 5 做持续集成(下):Jenkins + JUnit 5 + Git 持续集成本地实战演练完整复盘
git·测试工具·ci/cd·jenkins·集成测试·持续集成·junit5
天才测试猿19 小时前
Jmeter基础知识详解
自动化测试·软件测试·测试工具·jmeter·测试用例·接口测试·性能测试
程序员三藏21 小时前
软件测试之环境搭建及测试流程
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
慧都小项1 天前
Parasoft C/C++test如何在ARM DS-5环境中进行测试(下)
单元测试·parasoft·arm ds-5
utmhikari1 天前
【架构艺术】自动化测试平台架构设计的一些通用要点
自动化测试·功能测试·测试开发·架构·测试·系统设计·后端开发
JosieBook1 天前
【SpringBoot】30 核心功能 - 单元测试 - JUnit5 单元测试简介与常用注解实战详解
spring boot·后端·单元测试
xiecoding.cn1 天前
Selenium IDE下载和安装教程(附安装包)
selenium·测试工具·selenium安装·selenium ide·selenium ide下载·selenium下载
.又是新的一天.1 天前
04-Fiddler详解+抓包定位问题
前端·测试工具·fiddler