介绍
在接口自动化测试过程中,为了避免因客观原因导致测试用例执行失败,可以考虑为其添加失败就重跑策略。
我们的策略大致可分为两种:
- 用例执行失败后,记录下来,等用例都跑完后再进行重跑。
- 用例执行失败后,立即进行重跑。
策略一已在上一篇 TestNG -- 失败用例重跑机制(1)中进行了描述,所以这篇我主要讲述如何围绕 策略二 开展用例重跑。
策略二
在上一篇的代码基础上进行演示。
1、编写MyRetry类
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
/**
* 用于定义重跑次数
*/
public class MyRetry implements IRetryAnalyzer {
//当前累计次数变量
private int retryCount = 1;
//设置最大重跑次数,定义为常量。
private static final int maxRetryCount = 3;
@Override
public boolean retry(ITestResult result) {
if (retryCount<=maxRetryCount){
retryCount++;
return true;
}
return false;
}
}
2、编写监听器MyRetryListener类
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
import org.testng.internal.annotations.DisabledRetryAnalyzer;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* @author xcj
*
* 用于监听所有的测试用例,监控测试用例若没有设定@Test的retryAnalyzer属性
*/
public class MyRetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
//TestNG 7.0 版本之后不再支持iTestAnnotation.getRetryAnalyzer()。
//IRetryAnalyzer myRetry = iTestAnnotation.getRetryAnalyzer();
Class<? extends IRetryAnalyzer> retryAnalyzerClass = iTestAnnotation.getRetryAnalyzerClass();
//获取重跑注解类是否为空,是的话就加上重跑注解
if (retryAnalyzerClass == DisabledRetryAnalyzer.class) {
iTestAnnotation.setRetryAnalyzer(MyRetry.class);
}
}
}
3、编写testng.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="all_suite">
<test name="login_test">
<classes>
<class name="com.dc.tests.LoginDemo"></class>
</classes>
</test>
<test name="pay_test">
<classes>
<class name="com.dc.tests.PayDemo"></class>
</classes>
</test>
</suite>
4、编写测试实体类
import com.dc.util.CountUtil;
import org.testng.annotations.Test;
public class LoginDemo {
@Test
public void init() {
System.out.println("进行初始化!!!");
}
@Test(dependsOnMethods = "init")
public void login() {
//自己写的工具类,单例模式计算运行次数,这里主要假装在第三次后,该方法不再进行报错。
if (CountUtil.getInstance().getCount() <= 2) {
System.out.println("进行登录失败!!!");
throw new NullPointerException("用户不存在!!");
}
}
@Test(dependsOnMethods = "login")
public void logout() {
System.out.println("进行注销!!!");
}
}
import org.testng.annotations.Test;
public class PayDemo {
@Test
public void payInit(){
System.out.println("支付初始化!!");
}
@Test(dependsOnMethods = "payInit")
public void preOrder(){
System.out.println("预下单失败!!!");
throw new RuntimeException("预下单失败!!!");
}
@Test(dependsOnMethods = "preOrder")
public void pay(){
System.out.println("付费!!");
}
}
5、编写执行类
import com.dc.listener.ExtentTestNGIReporterListener;
import com.dc.listener.MyRetryListener;
import org.testng.TestNG;
import java.util.ArrayList;
import java.util.List;
/**
* @author xcj
* 主执行类,跑测试用例
*/
public class TestNgMain {
public static void main(String[] args) {
TestNG testNG = new TestNG();
testNG.setUseDefaultListeners(false);
testNG.addListener(new MyRetryListener());
testNG.addListener(new ExtentTestNGIReporterListener());
List suiteList = new ArrayList();
suiteList.add("./src/main/resources/testng.xml");
testNG.setTestSuites(suiteList);
testNG.run();
}
}
评论区