selenium實現失敗重運行

UI自動化腳本執行過程當中存在很是多的不穩定性,例如網絡的不穩定,瀏覽器無響應等等,這些失敗每每並非產品中的錯誤。那麼這時咱們每每須要對執行失敗的測試用例進行屢次重跑,確認其是否確實失敗。 那麼失敗重跑咱們能夠經過TestNG的功能來實現。java

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

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

需新建一個類TestNGListener繼承TestListenerAdapter,而後重寫onFinish方法spa

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

    }
相關文章
相關標籤/搜索