1. 程式人生 > >【TestNG】TestNG重新執行失敗用例

【TestNG】TestNG重新執行失敗用例

前言

有時候我們希望失敗用例可以重新執行N次,已避免出現因網路不穩定之類的情況導致的失敗,那麼如何實現呢,有如下方法:

1、直接重執行失敗用例

在每次用例執行完成後在用例結果輸出目錄會有叫做testng-failed.xml的檔案,此檔案內部就是失敗用例,需要注意的是此檔案內部將含有所有被依賴的方法,執行方法如下:

java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml

或者

java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs test-outputs\testng-failed.xml

2、重寫介面實現自動重執行

前面那個方法是在全部執行完畢後重執行失敗用例,那麼這個方法就可以實現自動執行失敗用例,主要步驟為如下兩步:

  1. 重寫一個介面org.testng.IRetryAnalyzer;
  2. 為@Test標註的檔案新增監聽器,例如@Test(retryAnalyzer = LocalRetry.class)或者直接在xml中新增監聽器;

如下為一個範例:

package com.demo.test.testng;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class MyIRetryAnalyzer implements IRetryAnalyzer{ private int retryCount = 0; private static final int maxRetryCount = 3; public boolean retry(ITestResult result) { if (retryCount < maxRetryCount) { retryCount++; return true; } return false; } }

用例如下:

package com.
demo.test.testng; import org.testng.Assert; import org.testng.annotations.Test; public class ListenerTest { @Test public void test1() { System.out.println("test1"); } @Test(retryAnalyzer=MyIRetryAnalyzer.class) public void test2() { System.out.println("test2"); Assert.assertFalse(true); } }

執行該用例,結果為:

[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
  C:\Users\dufei\AppData\Local\Temp\testng-eclipse-832342186\testng-customsuite.xml

test1
test2
test2
test2
test2
PASSED: test1
FAILED: test2

實際應用的時候,我們如果想單獨為某個用例設定這個失敗重執行則可以入上圖那樣為@Test註解新增一個(retryAnalyzer=MyIRetryAnalyzer.class),如果我們想直接為所有用例新增這個重執行該怎麼辦呢?直接將這個新增為監聽器?顯然是不行的,因為這個介面並非監聽器,不能加入,但是我們可以用監聽器IAnnotationTransformer,將重執行的介面實現類加入進來,範例如下:

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);
        }
    }
}

備註:這個監聽器的作用就是修改@Test註解的設定值。
而後再將這個監聽類加入到xml的監聽器中,譬如:

<?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>

這樣就可以為所有包含的用例新增這個失敗重運行了,至於這個最大重試次數,可以改為從外部配置傳入,譬如yaml檔案或者properties檔案。