前言
TestNG 启动之后会将所有的测试方法分成两类:
- 特定顺序运行的测试方法。针对有依赖关系(dependsOnMethods,dependsOnGroups)的测试方法。
- 没有特定运行顺序的测试方法。除开第一类说的,默认情况下,TestNG将尝试按class对测试方法进行分组执行。
为了让用户对第二类测试方法拥有更大的控制权,TestNG提供了IMethodInterceptor接口,可以通过实现该接口来控制测试方法的执行顺序。
public interface IMethodInterceptor {
List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context);
}
示例
编写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监听器确实起作用了。