下面簡單介紹下testNG的失敗重跑的實現方法:ide
1.首先編寫一個類,實現IRetryAnalyzer類,重寫其中的retry方法。ui
public class TestNGRetry implements IRetryAnalyzer { private int retryCount = 1;//設置當前的重跑次數 private static final int maxRetryCount = 3;//設置最大重跑次數,定義爲常量。 @Override public boolean retry(ITestResult iTestResult) { if (retryCount<=maxRetryCount){ System.out.println("it's the "+retryCount+"times retry.And the current case is"+iTestResult.getName());//輸出當前的重跑次數以及當前的正在重跑的用例名稱。 retryCount++;//重跑以後,次數+1 return true;//當return true以後,表明繼續重跑 } return false;//return false以後,表明中止重跑 } public void reSetCount(){ retryCount=1; } }
在完成這個方法的重寫以後,其實已經能夠實現失敗用例重跑了。前提是,用例上註解設置以下:spa
@Test(retryAnalyzer= TestNGRetry.class)
固然,咱們是指望全部的用例執行失敗以後,均可以重跑,因此就須要考慮執行時動態修改咱們用例的註解。testNG已經給實現了,咱們只
須要編寫一個類去實現IAnnotationTransformer,並重寫方法transform
public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) { IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();//獲取到retryAnalyzer的註解
if (retryAnalyzer == null){ iTestAnnotation.setRetryAnalyzer(TestNGRetry.class); } } }//若是註解爲空,則動態設置註解,以確保用例失敗後重跑。
在testNG的xml配置文件中配置上述監聽器:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="NeuronIOSSystemTest" parallel="true" thread-count="2"> <listeners> <listener class-name="com.neuron.util.TestRunnerListener" /> <listener class-name="com.nervos.neuron.retry.RetryListener"/> </listeners> <test verbose="2" name="Neuron iOS App System Test" preserve-order="true" enabled="true"> <classes> <class name="com.xxx.xxx.xxxTest" /> </classes> </test> </suite>
綜上,失敗用例重跑機制基本實現。可是在執行的時候,會發現一個問題:code
使用了dataProvider而且提供多個數據的時候,這個重跑次數是共用的,就會致使dataProvider提供的第一個數據執行失敗後,重跑3次。若是提供的第二個數據再次失敗了,就不會再重跑了。orm
或者dataProvider提供的第一個數據執行失敗後,重跑第一次的時候又成功了。提供的第二個數據再次失敗了,就只重跑2次。xml
因此,在用例執行失敗和用例執行成功後,都須要重置當前的重跑次數。blog
public class TestRunnerListener extends TestListenerAdapter { @Override public void onTestSuccess(ITestResult tr) { TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer(); retryAnalyzer.reSetCount(); finish(tr); } @Override public void onTestFailure(ITestResult tr) { TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer(); retryAnalyzer.reSetCount(); finish(tr); } }
以上,徹底實現了失敗用例的重跑機制。get