当前位置:   article > 正文

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

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

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

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

一、结合监听器配置

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

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

  1. public class TestngRetry implements IRetryAnalyzer {
  2. private static Logger logger = Logger.getLogger(TestngRetry.class);
  3. // 表示当前所重试的次数
  4. public static int retryCount = 1;
  5. // 表示重试最大次数限制
  6. public int maxRetryCount = 2;
  7. @Override
  8. public boolean retry(ITestResult result) {
  9. // TODO Auto-generated method stub
  10. if (retryCount <= maxRetryCount) {
  11. logger.info("开始重试第" + "【" + retryCount + "】次" );
  12. retryCount++;
  13. // 如果返回为true表示执行重试机制
  14. return true;
  15. }
  16. // 如果返回为false表示不执行重试机制
  17. return false;
  18. }
  19. }

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

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

  1. public class RetryListener implements IAnnotationTransformer {
  2. @Override
  3. public void transform(ITestAnnotation annotation, Class testClass, Constructor
  4. testConstructor, Method testMethod) {
  5. // TODO Auto-generated method stub
  6. IRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();
  7. if (iRetryAnalyzer == null) {
  8. annotation.setRetryAnalyzer(TestngRetry.class);
  9. }
  10. }
  11. }

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

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

引入的问题

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

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

原因:

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

  1. public class TestResultListener extends TestListenerAdapter{
  2. @Override
  3. public void onTestSuccess(ITestResult tr) {
  4. // TODO Auto-generated method stub
  5. super.onTestSuccess(tr);
  6. System.out.println("当前用例执行成功");
  7. //修复了TestNG的bug:dataprovider和重试机制冲突问题
  8. //用例重试机制有这种情况:当他运行到第一次重试or第二次重试or第三次(没有达到最大的重试次数的时候),有可能执行成功
  9. //用例此时会成功
  10. TestngRetry.currentRetryCount=1;
  11. }
  12. @Override
  13. public void onTestFailure(ITestResult tr) {
  14. // TODO Auto-generated method stub
  15. super.onTestFailure(tr);
  16. System.out.println("当前用例执行失败");
  17. TestngRetry.currentRetryCount=1;
  18. }
  19. @Override
  20. public void onTestSkipped(ITestResult tr) {
  21. // TODO Auto-generated method stub
  22. super.onTestSkipped(tr);
  23. System.out.println("当前用例执行跳过");
  24. }
  25. }

二、不配置监听器

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/202329
推荐阅读
相关标签
  

闽ICP备14008679号