testng對執行失敗的用例,再次執行


    前段時間在網絡上看到通過重寫TestNG的接口,可以再次執行失敗的測試用例,於是學習了,我之前的做法是當自己的腳本中碰到異常,就自動調用方法本身來達到再次執行用例的目的,這個過程中有設定重試的次數

    對於TestNG,首先重寫接口IRetryAnalyzer,重寫該接口中的retry方法,自定義需要重試的次數maxReTryNum,如果一個用例失敗,自動進入retry方法,在此方法中判斷已經重試的次數是否小於等於maxReTryNum,如果是,則返回true,則自動再次執行失敗的用例,如果是失敗的用例再次執行還是失敗,那么還是自動調用retry方法,直到到重試次數大於設定的maxReTryNum了,則返回false,那么系統就是判定該方法失敗了

public class OverrideIReTry implements IRetryAnalyzer {
    public static Logger logger=Logger.getLogger(OverrideIReTry.class);
    public int initReTryNum=1;
    public int maxReTryNum=3;
    @Override
    public boolean retry(ITestResult iTestResult) {
        if(initReTryNum<=maxReTryNum){
            String message="方法<"+iTestResult.getName()+">執行失敗,重試第"+initReTryNum+"次";
            logger.info(message);
            Reporter.setCurrentTestResult(iTestResult);
            Reporter.log(message);
            initReTryNum++;
            return true;
        }
        return false;
    }
}

 

    當我們重寫了TestNG的 IRetryAnalyzer 接口,那么就需要讓系統調用我們重寫的接口,需要讓TestNG調用,還需要對TestNG.xml中的注解接口進行重寫。先判斷TestNG.xml中是否有重試分析器,如果沒有,則調用我們自己重寫類
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);
        }
    }
}
 
    我們可以定義了2個方法test1和test2,代碼如下,其中test1方法執行是正確,test2執行一定是會報異常的,那么預期的結果是,test2方法失敗后,會被再次執行3次
public class ReTryTest {
    @Test
    public void test1(){
        System.out.println(1/1);
    }
    @Test
    public void test2(){
        System.out.println(1/0);
    }
}
     此時,我們就可以在TestNG.xml中直接聲明監聽重試的函數了,並且調用test1和test2來驗證重寫 IRetryAnalyzer是否會對失敗的用例重新執行
<?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>
    直接編譯后,我們可以看到log中是顯示這個的,說明了我們的重寫是可以正確的
[INFO ] main 2015-08-29 09:55:13,030                  reTry.OverrideIReTry     - 方法<test2>執行失敗,重試第1次
[INFO ] main 2015-08-29 09:55:13,031                  reTry.OverrideIReTry     - 方法<test2>執行失敗,重試第2次
[INFO ] main 2015-08-29 09:55:13,032                  reTry.OverrideIReTry     - 方法<test2>執行失敗,重試第3次

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM