testng失敗重跑


重跑失敗場景

1.要添加兩個文件

背景:因為這里只是想單獨展示失敗的重跑的案例,所以先暫時把app這塊的運行注釋掉,只跑一個簡單的demo,就一個簡單類,類中就3個測試方法,失敗重跑的原理是,運行方法是成功狀態,就不重跑,如果是失敗的,就在繼續執行方法,直到他設置的最大重跑次數時就停止,要先添加這個一個類,實現IRetryAnalyzer 這個方法,以下就是一個retry 類

失敗重跑代碼展示

package until;  
import org.apache.log4j.Logger;  
import org.testng.IRetryAnalyzer;  
import org.testng.ITestResult;  
  
public class retry implements IRetryAnalyzer{  
  
    private static Logger logger = Logger.getLogger(retry.class);  
    private int retryCount = 1;   
    private static int maxRetryCount = 3;  #控制失敗跑幾次
  
    public boolean retry(ITestResult result) {    
        if (retryCount < maxRetryCount) {  
            retryCount++;  
            return true;  
        }  
        return false;  
    }  

2.這個類RetryListener.Java主要是實現IAnnotationTransformer 方法

package until;  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Method;  
import org.apache.tools.ant.taskdefs.Retry;  
import org.testng.IAnnotationTransformer;  
import org.testng.IRetryAnalyzer;  
import org.testng.annotations.ITestAnnotation;  
    public class RetryListener implements IAnnotationTransformer {  
        @Override  
        public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,  
                Method testMethod) {  
             IRetryAnalyzer retry = annotation.getRetryAnalyzer();  
                if (retry == null) {  
                    annotation.setRetryAnalyzer(retry.class);   #注意這里的類名一定要寫對 
                }  
              
        }  
      
}  

 

3.在xml文件中配置監聽器, 監聽的是RetryListener這個類

<?xml version="1.0" encoding="gb2312"?>  
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">  
  
<suite name="SuiteName" >  
 <listeners>  
        <listener class-name="until.RetryListener" />   
    </listeners>  
    <test name="version" preserve-order="true">   
         <classes>  
              <class name="com.test.appuimtest.rosewholePC">  
                <methods>       
                     <include name="chooseNew"/>        
                </methods>   
            </class>   
         </classes>  
    </test>  
</suite> 

 

目前的目錄結構是這樣,但是關鍵是是retry.java, RetryListener.java, rosewholepc.java:

 

clip_image001[4]

3.實現:

在rosewholepc中寫入的方法就1個為

clip_image003[4]

查看執行效果,運行了三次

clip_image004[4]

以為這樣就完了,其實沒有,這個時候執行你會發現他會記錄你3次結果數據,但是其實我們只想記錄最后1次的數據,因為做UI你會發現,因為網絡原因會導致第一次失敗,第二次就正常了,所以我們增加重跑就可以減少腳本的誤報的情況,我們只要采取最后一次結果就好了,

4.解決這個問題我還需要那在TestngListener這個類里面的finnish監聽里面加上這段代碼就可以了


clip_image005[4]
執行類中的Xml文件加上這兩個監聽,RetryListener失敗重跑

執行效果

clip_image007[4]

有人中提到是去實現ITestListener接口, IestListenerAdapter 已經實現 ITestListener,並且提供了一些有用的方法,比如分別獲取所有成功失敗跳過三種測試結果的測試方法的方法,並且 ITestListner 中有很多方法而 TestListenerAdapter 已給出了默認實現。因此,繼承 TestListenerAdapter 后,便只需關注需要修改的方法。因為我們最開始用到的也是TestListenerAdapter,所以在onFinish中直接添加以上代碼就可以了

    @Override  
    public void onFinish(ITestContext testContext) {  
        super.onFinish(testContext);  
        //失敗后重跑,記錄最后一次結果
           Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();  
            while (listOfFailedTests.hasNext()) {  
                ITestResult failedTest = listOfFailedTests.next();  
                ITestNGMethod method = failedTest.getMethod();  
                if (testContext.getFailedTests().getResults(method).size() > 1) {  
                    listOfFailedTests.remove();  
                } else {  
                    if (testContext.getPassedTests().getResults(method).size() > 0) {  
                        listOfFailedTests.remove();  
                    }  
                }  
            }  
        }  
      

  

我在添加了2個案例

clip_image008[4]

執行效果如下

clip_image009[10]


免責聲明!

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



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