重跑失敗場景
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個案例
執行效果如下

![clip_image001[4] clip_image001[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM0NTg2MTgtNDI2NzI0MzU3LnBuZw==.png)
![clip_image003[4] clip_image003[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM1MDAyNTktMTkwNjQ2Mjk5NC5qcGc=.png)
![clip_image004[4] clip_image004[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM1MDE0NDYtNjY5MDI5OTMzLnBuZw==.png)
![clip_image007[4] clip_image007[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM1MDU3MjgtMjExODk2NzkwOS5qcGc=.png)
![clip_image008[4] clip_image008[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM1MDcxODEtMTc3ODc1NjIzMC5wbmc=.png)
![clip_image009[10] clip_image009[10]](/image/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvNTk3MzcxLzIwMTcwOS81OTczNzEtMjAxNzA5MjEwOTM1MDgwNDAtNjg0MTUwMTMucG5n.png)