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

    }

 

posted @ 2017-12-05 14:31  爱吃橙子  阅读(2364)  评论(0编辑  收藏  举报