当前位置: 首页 > news >正文

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

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

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

一、结合监听器配置

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

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

public class TestngRetry implements IRetryAnalyzer {private static Logger logger = Logger.getLogger(TestngRetry.class);// 表示当前所重试的次数public static int retryCount = 1;// 表示重试最大次数限制public int maxRetryCount = 2;@Overridepublic boolean retry(ITestResult result) {// TODO Auto-generated method stubif (retryCount <= maxRetryCount) {logger.info("开始重试第" + "【" + retryCount + "】次" );retryCount++;// 如果返回为true表示执行重试机制return true;}// 如果返回为false表示不执行重试机制return false;} 
}

step2:新建Java类RetryListener实现IAnnotationTransformer接口,复写transform方法

IAnnotationTransformer接口作用:在TestNG执行过程中动态修改@Test注解的参数

public class RetryListener implements IAnnotationTransformer {@Overridepublic void transform(ITestAnnotation annotation, Class testClass, ConstructortestConstructor, Method testMethod) {// TODO Auto-generated method stubIRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();if (iRetryAnalyzer == null) {annotation.setRetryAnalyzer(TestngRetry.class);} } 
}

step3:在testng.xml配置文件中添加RetryListener监听器即可

 <listener class-name="com.lemon.listener.RetryListener"></listener>

引入的问题

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

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

原因:

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

public class TestResultListener extends TestListenerAdapter{@Overridepublic void onTestSuccess(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSuccess(tr);System.out.println("当前用例执行成功");//修复了TestNG的bug:dataprovider和重试机制冲突问题//用例重试机制有这种情况:当他运行到第一次重试or第二次重试or第三次(没有达到最大的重试次数的时候),有可能执行成功//用例此时会成功TestngRetry.currentRetryCount=1; }@Overridepublic void onTestFailure(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestFailure(tr);System.out.println("当前用例执行失败");TestngRetry.currentRetryCount=1; }@Overridepublic void onTestSkipped(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSkipped(tr);System.out.println("当前用例执行跳过");} 
}

二、不配置监听器

public class MyRetry implements IRetryAnalyzer {private int retryCount = 0;private static final int maxRetryCount = 3;@Overridepublic boolean retry(ITestResult result) {if (retryCount < maxRetryCount) {retryCount++;return true;}//如果多个@Test方法中用了该注解,因为testng的bug,它new的是同一个MyRetry对象//那么count不清0会报错,因为是一个MyRetry对象,可以人为置为0,但是官网不推荐这么做retryCount = 0return false;}
}使用重试:
//在用例类里面 添加重试属性@Test(retryAnalyzer = MyRetry.class)public void failedLogin3() {}

http://www.lryc.cn/news/309266.html

相关文章:

  • “智农”-高标准农田
  • 利用 lxml 库的XPath()方法在网页中快速查找元素
  • nginx---------------重写功能 防盗链 反向代理 (五)
  • unity shaderGraph实例-物体线框显示
  • 分类问题经典算法 | 二分类问题 | Logistic回归:公式推导
  • redis实现分布式全局唯一id
  • Sora引发安全新挑战
  • Android 14.0 Launcher3定制化之桌面分页横线改成圆点显示功能实现
  • SemiDrive E3 MCAL 开发系列(3)– Wdg 模块的使用
  • AI推荐算法的演进之路
  • Tomcat安装,配置文件、组件
  • 精读《React Hooks 最佳实践》
  • varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换
  • 基于PHP的在线英语学习平台
  • 基于微信小程序电影院订票选座系统 (后台JSP+JDBC+Mysql)答辩常规问题和如何回答(答辩指导)
  • C++知识点总结(22):模拟算法真题 ★★★☆☆《安全警报》
  • 蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险
  • Unity的相机跟随和第三人称视角
  • 哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!
  • Stwo:基于Circle STARK和M31的下一代STARK证明系统
  • 笔记本以太网集线器Hub充电可能导致网络异常(貌似是我把服务器网关写错了)
  • npm ERR! code ETIMEDOUT
  • 动态规划(算法竞赛、蓝桥杯)--分组背包DP
  • 太阳能供电井盖-物联网智能井盖监测系统-旭华智能
  • 贪心 Leetcode 455 分发饼干
  • 策略开发:EMA如何计算
  • 学习Android的第二十天
  • Linux技巧|centos7|重新认识和学习egrep和grep命令
  • css实现背景渐变叠加
  • Unity(第二十四部)UI