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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM