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