selenium實現失敗重運行


UI自動化腳本執行過程中存在非常多的不穩定性,例如網絡的不穩定,瀏覽器無響應等等,這些失敗往往並不是產品中的錯誤。那么這時我們往往需要對執行失敗的測試用例進行多次重跑,確認其是否確實失敗。 那么失敗重跑我們可以通過TestNG的功能來實現。

一旦測試方法失敗,就會調用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,用例失敗自動重跑功能

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報告時,發現失敗的用例在報告里生成了多份,改進辦法

需新建一個類TestNGListener繼承TestListenerAdapter,然后重寫onFinish方法

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

    }

 


免責聲明!

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



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