重跑失敗場景
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:
3.實現:
在rosewholepc中寫入的方法就1個為
查看執行效果,運行了三次
以為這樣就完了,其實沒有,這個時候執行你會發現他會記錄你3次結果數據,但是其實我們只想記錄最后1次的數據,因為做UI你會發現,因為網絡原因會導致第一次失敗,第二次就正常了,所以我們增加重跑就可以減少腳本的誤報的情況,我們只要采取最后一次結果就好了,
4.解決這個問題我還需要那在TestngListener這個類里面的finnish監聽里面加上這段代碼就可以了
執行類中的Xml文件加上這兩個監聽,RetryListener失敗重跑
執行效果
有人中提到是去實現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個案例
執行效果如下