如何解决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,到此完事。

 
原文地址:https://www.cnblogs.com/cheese320/p/8478645.html