TestNG入门教程-14-失败重跑的第二种方法

来源:互联网 发布:詹姆斯本赛季盖帽数据 编辑:程序博客网 时间:2024/06/10 17:33

       前面我们介绍了TestNG中的Listener和简单举例,这篇来介绍下网上很多人采用的修改代码来实现测试用例的重跑(设置重跑多次),这当然离不开Listener相关接口。在介绍实现相关代码之前,我们先来了解几个接口。

1. 接口IRetryAnallyzer

       该接口的作用是提供去实现能够让用例运行失败重跑的设置。实现该接口必须要实现retry(ITestResult result)这个方法。返回值类型是布尔型,如果返回是True,那么就执行失败重跑,返回是false,就不重跑。参数result是当前运行的测试用例的结果状态。

2. 接口IAnnotationTransformer

       该接口的作用是在TestNG执行过程中动态改变测试类中Annotation的参数,当前这个接口主要是针对@Test注释。IAnnotationTransformer监听器接口只有一个方法:transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod).下面我们写的几个类方法都是来源网上资料,都实现了上面提到的两个接口。
3. 项目结构如下


第一个Java文件,MyRetry.java实现了IRetryAnalyzer接口,代码如下
package demo3;import org.testng.IRetryAnalyzer;import org.testng.ITestResult;/** * create by Anthony on 2017/11/27 */public class MyRetry implements IRetryAnalyzer{    // 设置当前失败执行的次数    private int retryCount = 1;    // 设置最大失败执行次数    private static int maxRetryCount = 3;    @Override    public boolean retry(ITestResult iTestResult) {        if(retryCount < maxRetryCount) {            retryCount++;            return true;        }        return false;    }}
第二个Java文件,MyRetryListener.java实现了IAnnotationTransformer接口,代码如下
package demo3;import org.testng.IAnnotationTransformer;import org.testng.IRetryAnalyzer;import org.testng.annotations.ITestAnnotation;import java.lang.reflect.Constructor;import java.lang.reflect.Method;/** * create by Anthony on 2017/11/27 */public class MyRetryListener implements IAnnotationTransformer {    @Override    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {        IRetryAnalyzer myRetry = iTestAnnotation.getRetryAnalyzer();        if (myRetry == null) {            iTestAnnotation.setRetryAnalyzer(MyRetry.class);        }    }}

       最后一段代码的意思就是对当前运行的用例先通过getRetryAnalyzer()获取重跑的次数的属性,如果属性为空,那么就设置我们自己设置的重跑次数(本文第一个类名称.class)

第三个java文件,写一个测试用例。

package demo3;import org.testng.Assert;import org.testng.annotations.Test;/** * create by Anthony on 2017/11/18 */public class ReRunFailedTestCaseDemo {    @Test    public void test01(){        System.out.println("test01");    }    @Test    public void test02(){        Assert.assertTrue(10==11);        System.out.println("test02");    }    @Test    public void test03(){        System.out.println("test03");    }}

设置两个成功,一个失败的用例。

下面配置testng.xml,添加上监听。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Default Suite">    <listeners>        <listener class-name="demo3.MyRetryListener"/>    </listeners>    <test name="Testng_learn" >        <classes>            <class name="demo3.ReRunFailedTestCaseDemo"/>        </classes>    </test></suite>

       运行这个testng.xml文件,会发现执行顺序是这样的,执行test01一次,test02三次,test03一次。注意这里,执行了三次失败的用例,实际上算重跑了两次。

       以下还有一种场景,例如我们经常跑测试用例,会发现某一些模块的用例是有出现失败的可能性情况比较多。例如我想监听登录的用例,然后让登录用例执行多次。这里我们把本篇文章的第二个类改下,第一个类抛弃,其他的都不变。第二个类改变如下。


       如果学习了之前我介绍的TestNG入门文章,应该对InvocationCount这个属性有了解,它作用就是设置一个方法调用的总次数。上面我把test03比作是登录的用例,我根据平时的经验判断,这个登录可能会出现问题,这里我设置调用次数为3次,也就是总共跑这个用例参数,运行下testNG.xml,会看到test03方法里的打印语句执行了三次

失败重跑的总结:

       通过对比这篇的实现方法和前面一篇我介绍的执行testng-failed.xml的方法,我还是比较喜欢第一种方法。由于我们经常对自己行项目的用例执行一次大概需要多长时间,所以我们完全可以采用第一种方法。这样的好处就是,我不用写监听,每次只管跑用例,设置一个足够让用例完成的时间,然后再把执行testng-failed.xml文件,这样就默认把全部失败的用例给再次执行了一遍。至于设置执行次数的问题,个人觉得失败一次和失败两次没有太大区别,跑第五次失败的可能性还是很大,再说设置一个for循环执行三遍testng-failed.xml也可以达到这个目的。