; ;

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]

posted @ 2017-09-21 09:35  做梦的人-  阅读(1728)  评论(0编辑  收藏  举报