在UI自動化測試用例執行過程中,經常會有很多不確定的因素導致用例執行失敗,比如網絡原因、環境問題等,所以我們有必要引入重試機制(失敗重跑),來提高測試用例成功率。
在不寫代碼的情況沒有提供可配置方式,需要自己實現TestNG提供的接口,并以監聽器的方式提供出來才可使用。
一、結合監聽器配置
step1:新建Java類TestngRetry實現IRetryAnalyzer接口,復寫retry方法
IRetryAnalyzer接口作用:實現此接口可以讓失敗的用例運行重試機制
public class TestngRetry implements IRetryAnalyzer {private static Logger logger = Logger.getLogger(TestngRetry.class);// 表示當前所重試的次數public static int retryCount = 1;// 表示重試最大次數限制public int maxRetryCount = 2;@Overridepublic boolean retry(ITestResult result) {// TODO Auto-generated method stubif (retryCount <= maxRetryCount) {logger.info("開始重試第" + "【" + retryCount + "】次" );retryCount++;// 如果返回為true表示執行重試機制return true;}// 如果返回為false表示不執行重試機制return false;}
}
step2:新建Java類RetryListener實現IAnnotationTransformer接口,復寫transform方法
IAnnotationTransformer接口作用:在TestNG執行過程中動態修改@Test注解的參數
public class RetryListener implements IAnnotationTransformer {@Overridepublic void transform(ITestAnnotation annotation, Class testClass, ConstructortestConstructor, Method testMethod) {// TODO Auto-generated method stubIRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();if (iRetryAnalyzer == null) {annotation.setRetryAnalyzer(TestngRetry.class);} }
}
step3:在testng.xml配置文件中添加RetryListener監聽器即可
<listener class-name="com.lemon.listener.RetryListener"></listener>
引入的問題
在運行重試的機制的時候我們會發現一個問題:
如果有引入dataprovider,那么dataprovider的第二組數據以后的用例失敗后是不會正常的運行重試機制的
原因:
TestNG自帶BUG,新建類TestResultListener繼承于TestListenerAdapter,重寫里面的onTestSuccess()和onTestFailure方法,在里面將當前的重試次數給置為1
public class TestResultListener extends TestListenerAdapter{@Overridepublic void onTestSuccess(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSuccess(tr);System.out.println("當前用例執行成功");//修復了TestNG的bug:dataprovider和重試機制沖突問題//用例重試機制有這種情況:當他運行到第一次重試or第二次重試or第三次(沒有達到最大的重試次數的時候),有可能執行成功//用例此時會成功TestngRetry.currentRetryCount=1; }@Overridepublic void onTestFailure(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestFailure(tr);System.out.println("當前用例執行失敗");TestngRetry.currentRetryCount=1; }@Overridepublic void onTestSkipped(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSkipped(tr);System.out.println("當前用例執行跳過");}
}
二、不配置監聽器
public class MyRetry implements IRetryAnalyzer {private int retryCount = 0;private static final int maxRetryCount = 3;@Overridepublic boolean retry(ITestResult result) {if (retryCount < maxRetryCount) {retryCount++;return true;}//如果多個@Test方法中用了該注解,因為testng的bug,它new的是同一個MyRetry對象//那么count不清0會報錯,因為是一個MyRetry對象,可以人為置為0,但是官網不推薦這么做retryCount = 0return false;}
}使用重試:
//在用例類里面 添加重試屬性@Test(retryAnalyzer = MyRetry.class)public void failedLogin3() {}