zoukankan      html  css  js  c++  java
  • testng失败重跑

    重跑失败场景

    1.要添加两个文件

    背景:因为这里只是想单独展示失败的重跑的案例,所以先暂时把app这块的运行注释掉,只跑一个简单的demo,就一个简单类,类中就3个测试方法,失败重跑的原理是,运行方法是成功状态,就不重跑,如果是失败的,就在继续执行方法,直到他设置的最大重跑次数时就停止,要先添加这个一个类,实现IRetryAnalyzer 这个方法,以下就是一个retry 类

    失败重跑代码展示

    package until;  
    import org.apache.log4j.Logger;  
    import org.testng.IRetryAnalyzer;  
    import org.testng.ITestResult;  
      
    public class retry implements IRetryAnalyzer{  
      
        private static Logger logger = Logger.getLogger(retry.class);  
        private int retryCount = 1;   
        private static int maxRetryCount = 3;  #控制失败跑几次
      
        public boolean retry(ITestResult result) {    
            if (retryCount < maxRetryCount) {  
                retryCount++;  
                return true;  
            }  
            return false;  
        }  

    2.这个类RetryListener.Java主要是实现IAnnotationTransformer 方法

    package until;  
    import java.lang.reflect.Constructor;  
    import java.lang.reflect.Method;  
    import org.apache.tools.ant.taskdefs.Retry;  
    import org.testng.IAnnotationTransformer;  
    import org.testng.IRetryAnalyzer;  
    import org.testng.annotations.ITestAnnotation;  
        public class RetryListener implements IAnnotationTransformer {  
            @Override  
            public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,  
                    Method testMethod) {  
                 IRetryAnalyzer retry = annotation.getRetryAnalyzer();  
                    if (retry == null) {  
                        annotation.setRetryAnalyzer(retry.class);   #注意这里的类名一定要写对 
                    }  
                  
            }  
          
    }  
    

    3.在xml文件中配置监听器, 监听的是RetryListener这个类

    <?xml version="1.0" encoding="gb2312"?>  
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">  
      
    <suite name="SuiteName" >  
     <listeners>  
            <listener class-name="until.RetryListener" />   
        </listeners>  
        <test name="version" preserve-order="true">   
             <classes>  
                  <class name="com.test.appuimtest.rosewholePC">  
                    <methods>       
                         <include name="chooseNew"/>        
                    </methods>   
                </class>   
             </classes>  
        </test>  
    </suite> 
    

     

    目前的目录结构是这样,但是关键是是retry.java, RetryListener.java, rosewholepc.java:

    clip_image001[4]

    3.实现:

    在rosewholepc中写入的方法就1个为

    clip_image003[4]

    查看执行效果,运行了三次

    clip_image004[4]

    以为这样就完了,其实没有,这个时候执行你会发现他会记录你3次结果数据,但是其实我们只想记录最后1次的数据,因为做UI你会发现,因为网络原因会导致第一次失败,第二次就正常了,所以我们增加重跑就可以减少脚本的误报的情况,我们只要采取最后一次结果就好了,

    4.解决这个问题我还需要那在TestngListener这个类里面的finnish监听里面加上这段代码就可以了


    clip_image005[4]
    执行类中的Xml文件加上这两个监听,RetryListener失败重跑

    执行效果

    clip_image007[4]

    有人中提到是去实现ITestListener接口, IestListenerAdapter 已经实现 ITestListener,并且提供了一些有用的方法,比如分别获取所有成功失败跳过三种测试结果的测试方法的方法,并且 ITestListner 中有很多方法而 TestListenerAdapter 已给出了默认实现。因此,继承 TestListenerAdapter 后,便只需关注需要修改的方法。因为我们最开始用到的也是TestListenerAdapter,所以在onFinish中直接添加以上代码就可以了

        @Override  
        public void onFinish(ITestContext testContext) {  
            super.onFinish(testContext);  
            //失败后重跑,记录最后一次结果
               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();  
                        }  
                    }  
                }  
            }  
          
    

      

    我在添加了2个案例

    clip_image008[4]

    执行效果如下

    clip_image009[10]

  • 相关阅读:
    6.Ray-消息订阅器编写
    附录:2-Event Sourcing pattern (事件溯源设计模式)
    附录:1-Grain生命周期-译注
    4.Ray-Handler之CoreHandler编写
    Q&A-20180128
    TODO
    3.Ray-Event编写
    缓存技术内部交流_01_Ehcache3简介
    Spring AMQP 源码分析 04
    Spring AMQP 源码分析 03
  • 原文地址:https://www.cnblogs.com/chongyou/p/7566876.html
Copyright © 2011-2022 走看看