侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

TestNG -- 失败用例重跑机制(2)

一朵云
2021-03-29 / 0 评论 / 2 点赞 / 8052 阅读 / 5814 字

介绍

  在接口自动化测试过程中,为了避免因客观原因导致测试用例执行失败,可以考虑为其添加失败就重跑策略。

  我们的策略大致可分为两种:

  1. 用例执行失败后,记录下来,等用例都跑完后再进行重跑。
  2. 用例执行失败后,立即进行重跑。

  策略一已在上一篇 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();

    }
}

6、执行结果演示

image.png

2

评论区