zoukankan      html  css  js  c++  java
  • testNG-失败用例重跑机制

    下面简单介绍下testNG的失败重跑的实现方法:

    1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法。

    public class TestNGRetry implements IRetryAnalyzer {
    
        private int retryCount = 1;//设置当前的重跑次数
        private static final int maxRetryCount = 3;//设置最大重跑次数,定义为常量。
    
        @Override
        public boolean retry(ITestResult iTestResult) {
            if (retryCount<=maxRetryCount){
                System.out.println("it's the "+retryCount+"times retry.And the current case is"+iTestResult.getName());//输出当前的重跑次数以及当前的正在重跑的用例名称。
    
                retryCount++;//重跑之后,次数+1
                return true;//当return true之后,代表继续重跑
            }
            return false;//return false之后,代表停止重跑
        }
    
        public void reSetCount(){
            retryCount=1;
        }
    
    }

    在完成这个方法的重写之后,其实已经可以实现失败用例重跑了。前提是,用例上注解设置如下:

    @Test(retryAnalyzer= TestNGRetry.class)
    当然,我们是期望所有的用例执行失败之后,都可以重跑,所以就需要考虑执行时动态修改我们用例的注解。testNG已经给实现了,我们只
    需要编写一个类去实现IAnnotationTransformer,并重写方法transform
    
    
    public class RetryListener implements IAnnotationTransformer {
        @Override
        public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
            IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();//获取到retryAnalyzer的注解
    if (retryAnalyzer == null){ iTestAnnotation.setRetryAnalyzer(TestNGRetry.class); } } }//如果注解为空,则动态设置注解,以确保用例失败后重跑。
    在testNG的xml配置文件中配置上述监听器:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="NeuronIOSSystemTest" parallel="true"
        thread-count="2">
        <listeners>
            <listener
                class-name="com.neuron.util.TestRunnerListener" />
            <listener class-name="com.nervos.neuron.retry.RetryListener"/>
        </listeners>
    
        <test verbose="2" name="Neuron iOS App System Test"
            preserve-order="true" enabled="true">
            <classes>
                <class name="com.xxx.xxx.xxxTest" />
                
            </classes>
        </test>
    </suite>

    综上,失败用例重跑机制基本实现。但是在执行的时候,会发现一个问题:

    使用了dataProvider并且提供多个数据的时候,这个重跑次数是共用的,就会导致dataProvider提供的第一个数据执行失败后,重跑3次。如果提供的第二个数据再次失败了,就不会再重跑了。

    或者dataProvider提供的第一个数据执行失败后,重跑第一次的时候又成功了。提供的第二个数据再次失败了,就只重跑2次。

    所以,在用例执行失败和用例执行成功后,都需要重置当前的重跑次数。

    public class TestRunnerListener extends TestListenerAdapter {
        @Override
        public void onTestSuccess(ITestResult tr) {
            TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer();
            retryAnalyzer.reSetCount();
            finish(tr);
        }
    
    
        @Override
        public void onTestFailure(ITestResult tr) {
         TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer();
            retryAnalyzer.reSetCount();
            finish(tr);
        }
    }

    以上,完全实现了失败用例的重跑机制。




  • 相关阅读:
    mysql语句查询:查询距离某个日期10天的数据
    Http中cookie的使用以及用CookieManager管理cookie
    HttpURLConnection绕过HTTPS的SSL验证
    echarts的简单应用之(二)饼图
    echarts的简单应用之(一)柱形图
    java中字节流与字符流的区别
    对SpringMVC框架的理解(转)
    opencv之yaml和xml文件读写
    C++之读取和写入文件
    opencv之投影点云到图像中
  • 原文地址:https://www.cnblogs.com/clairejing/p/10215054.html
Copyright © 2011-2022 走看看