前段時間在網絡上看到通過重寫TestNG的接口,可以再次執行失敗的測試用例,於是學習了,我之前的做法是當自己的腳本中碰到異常,就自動調用方法本身來達到再次執行用例的目的,這個過程中有設定重試的次數
對於TestNG,首先重寫接口IRetryAnalyzer,重寫該接口中的retry方法,自定義需要重試的次數maxReTryNum,如果一個用例失敗,自動進入retry方法,在此方法中判斷已經重試的次數是否小於等於maxReTryNum,如果是,則返回true,則自動再次執行失敗的用例,如果是失敗的用例再次執行還是失敗,那么還是自動調用retry方法,直到到重試次數大於設定的maxReTryNum了,則返回false,那么系統就是判定該方法失敗了
public class OverrideIReTry implements IRetryAnalyzer { public static Logger logger=Logger.getLogger(OverrideIReTry.class); public int initReTryNum=1; public int maxReTryNum=3; @Override public boolean retry(ITestResult iTestResult) { if(initReTryNum<=maxReTryNum){ String message="方法<"+iTestResult.getName()+">執行失敗,重試第"+initReTryNum+"次"; logger.info(message); Reporter.setCurrentTestResult(iTestResult); Reporter.log(message); initReTryNum++; return true; } return false; } }
當我們重寫了TestNG的
IRetryAnalyzer
接口,那么就需要讓系統調用我們重寫的接口,需要讓TestNG調用,還需要對TestNG.xml中的注解接口進行重寫。先判斷TestNG.xml中是否有重試分析器,如果沒有,則調用我們自己重寫類
public class OverrideIAnnotationTransformer implements IAnnotationTransformer{ @Override public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) { IRetryAnalyzer iRetryAnalyzer= iTestAnnotation.getRetryAnalyzer(); if(iRetryAnalyzer==null){ iTestAnnotation.setRetryAnalyzer(OverrideIReTry.class); } } }
我們可以定義了2個方法test1和test2,代碼如下,其中test1方法執行是正確,test2執行一定是會報異常的,那么預期的結果是,test2方法失敗后,會被再次執行3次
public class ReTryTest { @Test public void test1(){ System.out.println(1/1); } @Test public void test2(){ System.out.println(1/0); } }
此時,我們就可以在TestNG.xml中直接聲明監聽重試的函數了,並且調用test1和test2來驗證重寫
IRetryAnalyzer是否會對失敗的用例重新執行
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="casual"> <listeners> <listener class-name="reTry.OverrideIAnnotationTransformer"></listener> </listeners> <test name="test"> <classes> <class name="reTry.ReTryTest"> <methods> <include name="test1"/> <include name="test2"/> </methods> </class> </classes> </test> </suite>
直接編譯后,我們可以看到log中是顯示這個的,說明了我們的重寫是可以正確的
[INFO ] main 2015-08-29 09:55:13,030 reTry.OverrideIReTry - 方法<test2>執行失敗,重試第1次 [INFO ] main 2015-08-29 09:55:13,031 reTry.OverrideIReTry - 方法<test2>執行失敗,重試第2次 [INFO ] main 2015-08-29 09:55:13,032 reTry.OverrideIReTry - 方法<test2>執行失敗,重試第3次