(十三)TestNG学习之路—方法拦截器

目录

(一)TestNG学习之路—HelloWorld入门
(二)TestNG学习之路—注解及属性概览
(三)TestNG学习之路—TestNG.xml/YAML
(四)TestNG学习之路—注解详述之@Test
(五)TestNG学习之路—注解详述之参数化
(六)TestNG学习之路—注解详述之@Factory
(七)TestNG学习之路—注解详述之忽略测试
(八)TestNG学习之路—注解详述之并发
(九)TestNG学习之路—失败测试重跑
(十)TestNG学习之路—编码执行TestNG
(十一)TestNG学习之路—BeanShell高级用法
(十二)TestNG学习之路—注解转换器
(十三)TestNG学习之路—方法拦截器
(十四)TestNG学习之路—TestNG监听器
(十五)TestNG学习之路—依赖注入
(十六)TestNG学习之路—测试报告
(十七)基于TestNG+Rest Assured+Allure的接口自动化测试框架

前言

TestNG 启动之后会将所有的测试方法分成两类:

  • 特定顺序运行的测试方法。针对有依赖关系(dependsOnMethods,dependsOnGroups)的测试方法。
  • 没有特定运行顺序的测试方法。除开第一类说的,默认情况下,TestNG将尝试按class对测试方法进行分组执行。

为了让用户对第二类测试方法拥有更大的控制权,TestNG提供了IMethodInterceptor接口,可以通过实现该接口来控制测试方法的执行顺序。

public interface IMethodInterceptor {
  List intercept(List methods, ITestContext context);
}

intercept 方法在所有测试方法被分类后以及所有测试方法被执行前被调用。所有的测试方法将按照 intercept 返回值列表中的顺序被执行。因此,用户在 intercept 方法中可以对列表进行修改,比如重新排序,甚至增加或者减少测试方法。另外,方法中传递的ITestContext入参,用户可以自定义某些值(IAttributes.setAttribute(String, Object)
),后续在测试报告展现。

示例

编写IMethodInterceptor实现类,用于执行grp1组的测试用例。

import com.Test;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MethodInterceptors implements IMethodInterceptor {

    public List intercept(List methodInstances, ITestContext context) {
        List result = new ArrayList();

        for (IMethodInstance methodInstance : methodInstances) {
            ITestNGMethod method = methodInstance.getMethod();
            Set groups = new HashSet();

            if (method.isTest()) { //如果是@Test注解
                for (String group : method.getGroups()) {
                    groups.add(group);  //获取@Test注解的所有组
                }
            }

            if (groups.contains("grp1"))  //只运行grp1组
                result.add(methodInstance);
        }

        return result;
    }
}

编写测试类,并添加监听器注解@Listeners(MethodInterceptors.class):

import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(MethodInterceptors.class)
public class MethodInterceptorsTest {
    @BeforeClass
    public void bfClass(){
        System.out.println("BeforeClass");
    }

    @Test(groups = "grp1")
    public void test1(){
        System.out.println("test1");
    }

    @Test(groups = "grp2")
    public void test2(){
        System.out.println("test2");
    }

    @Test(groups = "grp2")
    public void test3(){
        System.out.println("test3");
    }

    @AfterClass
    public void afClass(){
        System.out.println("AfterClass");
    }
}

执行结果如下:

BeforeClass
test1
AfterClass

===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

如上执行结果所示,MethodInterceptors监听器确实起作用了。

扩展学习资料

IMethodInterceptor 监听器入门级教学 (通过 IMethodInterceptor 监听器实现运行指定的组)
实战 TestNG 监听器
IMethodInterceptor javadoc

你可能感兴趣的:((十三)TestNG学习之路—方法拦截器)