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

       前面我们介绍了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也可以达到这个目的。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值