【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() {}
相关推荐
Small black human5 小时前
HTTP-Postman的安装及其使用
测试工具·postman
AIZHINAN9 小时前
Appium 简介
自动化测试·测试工具·appium
仰望星空@脚踏实地15 小时前
Spring Boot Web 服务单元测试设计指南
spring boot·后端·单元测试
吴free15 小时前
mac电脑wireshark快速实现http接口抓包
网络·测试工具·http·wireshark
DeamoTech21 小时前
ESCADA
物联网·测试工具
旷世奇才李先生1 天前
Selenium 安装使用教程
selenium·测试工具
百度测试开发1 天前
【软件测试】银行项目-转账功能测试点(详全)
自动化测试·软件测试·功能测试·软件测试工程师·接口测试·软件测试面试题·银行测试
巴里巴气2 天前
对selenium进行浏览器和驱动进行配置Windows | Linux
selenium·测试工具
有趣的我3 天前
wireshark介绍和使用
网络·测试工具·wireshark
草履虫建模3 天前
Postman - API 调试与开发工具 - 标准使用流程
java·测试工具·spring·json·测试用例·postman·集成学习