zoukankan      html  css  js  c++  java
  • 如何解决testng执行用例失败自动重跑问题

    注: 以下内容引自 http://blog.csdn.net/MenofGod/article/details/72846649

    看过几个相关问题的帖子,内容类似,不过这篇解决问题的步骤和代码比较清晰,所以把这篇帖子也保存下来.

    如何解决testng执行用例失败自动重跑问题

    原创 2017年06月02日 17:56:24

    今天给大家分享一下testng执行用例失败自动重跑问题的解决办法,为什么要写这篇博客?有人会说了,网上找一车一车的,干嘛自己搁这儿写这个。。。

    没错,网上是有很多,只是我感觉按照网上的说法去做不一定一次点亮,可能跟我们每个人的理解不一样,也可能是网上说的也不一定都准确,这个大家都能理解,所以呢,老套路:我想用我自己的方式,站在大家也有被此问题困惑的角度写出解决办法,我认为这个是最重要的。好了,废话少说,正儿八经的呈上:

    一、首先新建Java类实现IRetryAnalyzer接口,代码如下(主要配置自动重跑次数maxRetryCount):

    [java] view plain copy
       
     1 public class OverrideIReTry implements IRetryAnalyzer {  
     2     public static Logger logger=Logger.getLogger(OverrideIReTry.class);  
     3     public int retryCount=0;  
     4     private static int maxRetryCount ;  
     5     static {  
     6         //外围文件配置最大运行次数,失败后重跑maxRetryCount+1次  
     7   
     8         maxRetryCount = 2;//也就是失败后重跑3次  
     9         logger.info("maxRunCount=" + (maxRetryCount));  
    10     }  
    11   
    12  @Override public boolean retry(ITestResult iTestResult){   
    13             if(retryCount <= maxRetryCount){String message = "running retry for '" + iTestResult.getName() + "' on class " +   
    14                    this.getClass().getName() + " Retrying " + retryCount + " times";   
    15            logger.info(message);  
    16            Reporter.setCurrentTestResult(iTestResult);  
    17            Reporter.log("RunCount=" + (retryCount + 1));   
    18            retryCount++;   
    19              return true;  
    20              } return false;  
    21      }  
    22 } 
    二、新建Java类实现IAnnotationTransformer接口,代码如下:
    [java] view plain copy
       
     1 package TezitongAll;  
     2   
     3 import java.lang.reflect.Constructor;  
     4 import java.lang.reflect.Method;  
     5   
     6 import org.testng.IAnnotationTransformer;  
     7 import org.testng.IRetryAnalyzer;  
     8 import org.testng.annotations.ITestAnnotation;  
     9   
    10 public class RetryListener implements IAnnotationTransformer {  
    11     @Override  
    12     public void transform(ITestAnnotation annotation, @SuppressWarnings("rawtypes") Class testClass,@SuppressWarnings("rawtypes") Constructor testConstructor, Method testMethod) {  
    13         IRetryAnalyzer retry = annotation.getRetryAnalyzer();  
    14         if (retry == null) {  
    15             annotation.setRetryAnalyzer(OverrideIReTry.class);  
    16         }  
    17     }  
    18 }  
    三、我们还有重写onFinish方法,我这里呢同样新建了一个类,代码如下:
    [java] view plain copy
       
     1 package TezitongAll;  
     2   
     3 import java.util.Iterator;  
     4 import org.testng.ITestContext;  
     5 import org.testng.ITestNGMethod;  
     6 import org.testng.ITestResult;  
     7 import org.testng.TestListenerAdapter;  
     8 import org.testng.log4testng.Logger;  
     9   
    10 public class TestngListener extends TestListenerAdapter {  
    11 private static Logger logger = Logger.getLogger(TestngListener.class);  
    12   
    13 @Override  
    14 public void onTestFailure(ITestResult tr) {  
    15         super.onTestFailure(tr);  
    16         logger.info(tr.getName() + " Failure");  
    17 }  
    18   
    19 @Override  
    20 public void onTestSkipped(ITestResult tr) {  
    21         super.onTestSkipped(tr);  
    22         logger.info(tr.getName() + " Skipped");  
    23 }  
    24   
    25 @Override  
    26 public void onTestSuccess(ITestResult tr) {  
    27         super.onTestSuccess(tr);  
    28         logger.info(tr.getName() + " Success");  
    29 }  
    30   
    31 @Override  
    32 public void onTestStart(ITestResult tr) {  
    33         super.onTestStart(tr);  
    34         logger.info(tr.getName() + " Start");  
    35 }  
    36   
    37 @Override  
    38 public void onFinish(ITestContext testContext) {  
    39         super.onFinish(testContext);  
    40         Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();  
    41         while (listOfFailedTests.hasNext()) {  
    42         ITestResult failedTest = (ITestResult) listOfFailedTests.next();  
    43         ITestNGMethod method = failedTest.getMethod();  
    44             if (testContext.getFailedTests().getResults(method).size() > 1) {  
    45                     listOfFailedTests.remove();  
    46                     }   
    47             else {  
    48                     if (testContext.getPassedTests().getResults(method).size() > 0) {  
    49                     listOfFailedTests.remove();  
    50             }  
    51   
    52     }  
    53    }  
    54   }  
    55 }  
    四、之后,我们在testng.xml中添加监听,代码如下:
    [html] view plain copy
       
     1 <listeners>  
     2         <listener class-name="TezitongAll.TestngListener"></listener> //需要改成自己目录的路径和名称  
     3         <listener class-name="TezitongAll.RetryListener"></listener>  //需要改成自己目录的路径和名称  
     4 </listeners>   
     5   
     6  //以下为你要运行的case在哪个类下边就配置相应的路径和name  
     7 <test name="usersinfo">  
     8         <classes>  
     9             <class name="TezitongAll.TezitongAll" />  
    10         </classes>  
    11     </test>   
    五、以上完成之后,执行我们的testng.xml(记住:每次都要执行testng.xml才能监听到你测case是否失败了,失败才会重跑)如下:

    六、查看运行结果(***是我为了看到底有没有重跑,如果有重跑了几次而加上的标记),如下:

    七、OK,到此完事。

     
  • 相关阅读:
    典型分布式系统分析:MapReduce
    linux下如何查看自己都装了什么服务
    docker
    linux的命令操作
    IDEA去除掉虚线,波浪线,和下划线实线的方法
    在linux下安装配置rabbitMQ详细教程
    在linux下安装配置rabbitMQ详细教程
    Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
    shell之startup
    shell脚本特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)
  • 原文地址:https://www.cnblogs.com/cheese320/p/8478645.html
Copyright © 2011-2022 走看看