自動化測試過過程當中,有些testcase會由於各類緣由失敗,好比網絡問題/服務器問題/數據庫問題/系統問題/瀏覽器問題等等,做爲自動化測試者,咱們須要再次執行失敗的測試用例,對於testng框架使用者,這裏有兩種方案來執行失敗的用例。數據庫
方案一. 使用「testng-failed.xml」來執行失敗的測試用例.瀏覽器
steps: 1. 在第一次執行完自動化測試以後,刷新項目文件夾。服務器
2. 一個文件夾名爲「test-output」自動生成,在該文件夾內,有一個文件是「testng-failed.xm」。網絡
3. Run testng-failed.xml,就會再次執行失敗的測試用例。框架
方案二. 經過實現TestNG IRetryAnalyzer接口來執行失敗的測試用例ide
新建一個類來實現IRetryAnalyzer,並重寫這個接口裏面爲一個的一個方法 retry測試
public class RetryAnalyzer implements IRetryAnalyzer { private int retryCount = 0; private static int retryLimit = 3; @Override public boolean retry(ITestResult result) { String testClassName = String.format("%s.%s", result.getMethod().getRealClass().toString(), result.getMethod().getMethodName()); if(retryCount < retryLimit){ Log.info("[RETRYING] " + testClassName + " FAILED, " + "Retrying " + (retryCount+1)+ " time", true); retryCount ++; CurrentManager.putParameter("retryCount", String.valueOf(retryCount)); return true; } else { return false; } } }
重寫完這個retryAnalyzer接口以後,能夠在test method上面加上這個類:ui
@Test(retryAnalyzer = RetryAnalyzer.class) public void test(){ Assert.assertEquals(1,2); }
而後再執行這個測試的時候,若是測試失敗,就會自動retry 3次,從新執行這個測試用例。spa
除了上面這種方法,還能夠用一個retryListener,在測試執行期間,就能對全部失敗的測試用例re-run。code
public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) { IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer(); if(retryAnalyzer == null){ iTestAnnotation.setRetryAnalyzer(RetryAnalyzer.class); } } }
這裏面用到了接口IAnnotationTransformer,他的方法transformer會在測試運行期間被每個test method調用,這個接口會給每個test method添加annotation。而後在testng.xml file中,添加這個listener:
<listeners> <listener class-name="com.stubhub.aroma.platform.controller.RetryListener" /> </listeners>
執行這個xml file,針對test suite裏面全部的測試,失敗的test method就會從新被執行。
實現了re-run failed case以後,也有另一個問題跟個人需求不符合,從新執行過失敗的test method以後,testng給出的test result中,把failed cases標記爲了skipped,好比一個test method,執行第一次失敗,而後retry 3 次,全都失敗,testng給出的result就是Total tests run: 4, Failures: 1, Skips: 3.
一共4次失敗,前三次都會被標記爲skip,只有最後一次被標記爲fail。 對於個人需求,我須要將testng result 展示到report中,我指望的result是 run 1 case, failed 1. 因此我後面在ITestListener的實現類的onTestFailure / onTestSuccess方法中,多加了邏輯來處理多餘的skipped case。
@Override public void onTestFailure(ITestResult result) { if(CurrentManager.getParameter("retryCount") != null){ ITestNGMethod method = result.getMethod(); while(!result.getTestContext().getSkippedTests().getResults(method).isEmpty()){ result.getTestContext().getSkippedTests().removeResult(method); } } }