• 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();
                    }
                }
            }
    
        }
  • 相关阅读:
    微信小程序使用场景及取名“潜”规则
    微信小程序入门——Mustache语法学习
    微信小程序开发需要注意的29个坑
    微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)
    精进:如何成为一个很厉害的人---书摘
    软件项目如何控制需求蔓延
    给现有MVC 项目添加 WebAPI
    Web API与国际化
    基于Attribute的Web API路由设置
    NuGet学习笔记1——初识NuGet及快速安装使用
  • 原文地址:https://www.cnblogs.com/fulucky/p/7986808.html
Copyright © 2020-2023  润新知