前言
TestNG 启动之后会将所有的测试方法分成两类:
- 特定顺序运行的测试方法。针对有依赖关系(dependsOnMethods,dependsOnGroups)的测试方法。
- 没有特定运行顺序的测试方法。除开第一类说的,默认情况下,TestNG将尝试按class对测试方法进行分组执行。
为了让用户对第二类测试方法拥有更大的控制权,TestNG提供了IMethodInterceptor接口,可以通过实现该接口来控制测试方法的执行顺序。
public interface IMethodInterceptor {
List<IMethodInstance> intercept(List<IMethodInstance> 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<IMethodInstance> intercept(List<IMethodInstance> methodInstances, ITestContext context) {
List<IMethodInstance> result = new ArrayList<IMethodInstance>();
for (IMethodInstance methodInstance : methodInstances) {
ITestNGMethod method = methodInstance.getMethod();
Set<String> groups = new HashSet<String>();
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
网友评论