Re-run failed tests in testng

自動化測試過過程當中,有些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);
            }
            }
    }
相關文章
相關標籤/搜索