使用的監聽類有:IRetryAnalyzer、TestListenerAdapter、IAnnotationTransformeride
public class Retry implements IRetryAnalyzer { private int retryCnt = 0; private int maxRetryCnt = 1; @Override public boolean retry(ITestResult iTestResult) { if (retryCnt<maxRetryCnt){ retryCnt++; return true; } return false; } // 用於重置retryCnt public void reset() { retryCnt = 0; } }
public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) { IRetryAnalyzer retry = iTestAnnotation.getRetryAnalyzer(); if (retry == null) { iTestAnnotation.setRetryAnalyzer(Retry.class); } } }
/** * 使用dataProvider時,每一個case運行結束都強制重置重試次數,若是失敗,則重試結束後,重置次數 */ public class TestngListener extends TestListenerAdapter { @Override public void onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); // 對於dataProvider的用例,每次成功後,重置Retry次數 Retry retry = (Retry) tr.getMethod().getRetryAnalyzer(); retry.reset(); } @Override public void onTestFailure(ITestResult tr) { super.onTestFailure(tr); // 對於dataProvider的用例,每次失敗後,重置Retry次數 Retry retry = (Retry) tr.getMethod().getRetryAnalyzer(); retry.reset(); } }
新建測試類測試
public class MyTest { @Test(dataProvider = "d1") public void dd(int i) { System.out.println("i="+i); int count = 0; Assert.assertEquals(i,5); } @DataProvider(name="d1") public Object[][] aa() { return new Object[][] { { 11}, }; } }
testng的xml文件加入listenerspa
<test name="test"> <packages> <package name="qjf"></package> </packages> </test> <listeners> <listener class-name="com.crm.Retry.RetryListener"></listener> <listener class-name="com.Retry.TestngListener"></listener> </listeners>
運行該xml文件,失敗後又重試了1次,重試的那一次背忽略code
參考:https://ntflc.com/2018/10/18/TestNg-Retry-Failed-Tests-with-DataProvider/#moreorm