UI自動化腳本執行過程當中存在很是多的不穩定性,例如網絡的不穩定,瀏覽器無響應等等,這些失敗每每並非產品中的錯誤。那麼這時咱們每每須要對執行失敗的測試用例進行屢次重跑,確認其是否確實失敗。 那麼失敗重跑咱們能夠經過TestNG的功能來實現。java
一旦測試方法失敗,就會調用TestNG的IRetryAnalyzer接口的retry
方法。若是您想從新執行失敗的測試用例,那麼就讓此方法返回true,若是不想從新執行測試用例,則返回false。瀏覽器
以下咱們新建一個TestngRetry類,實現IRetryAnalyzer :網絡
import org.testng.IRetryAnalyzer; import org.testng.ITestResult; /** * 用例失敗自動重跑邏輯 * @author Charlie.chen * */ public class TestNGRetry implements IRetryAnalyzer { public LogUtil log = new LogUtil(this.getClass()); private int retryCount = 0; private int maxRetryCount=2; public boolean retry(ITestResult result) { if (retryCount <= maxRetryCount) { String message = "running retry for '" + result.getName() + "' on class " + this.getClass().getName() + " Retrying " + retryCount + " times"; log.info(message); retryCount++; return true; } return false; } }
添加用例重跑監聽器RetryListener,用例失敗自動重跑功能ide
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.testng.IAnnotationTransformer; import org.testng.IRetryAnalyzer; import org.testng.annotations.ITestAnnotation; /** * 添加用例重跑監聽器,用例失敗自動重跑功能 * * @author Charlie.chen * */ public class RetryListener implements IAnnotationTransformer { public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry = annotation.getRetryAnalyzer(); if (retry == null) { annotation.setRetryAnalyzer(TestNGRetry.class); } } }
在testng.xml文件中配置本身編寫的監聽器測試
<listeners> <listener class-name="com.dji.utils.RetryListener"/> </listeners>
查看testng報告時,發現失敗的用例在報告裏生成了多份,改進辦法this
需新建一個類TestNGListener繼承TestListenerAdapter,而後重寫onFinish方法spa
@Override public void onFinish(ITestContext testContext) { log.info("Test Finish"); 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(); } } } }