通常testNG最常使用的方法就是@Test,@Test有一些常用的注释。比如我们需要控制不同的方法的执行顺序或者依赖关系,通常会使用priority,或者要控制一个类里某些@Test暂时不运行,会使用enabled。这些注释一般都写在代码里,如果我们需要动态修改@Test方法的优先级或者依赖关系等属性,需要用到监听器IMethodInterceptor。
1、创建监听器
2、创建表存储需要动态修改的属性
3、在@Test测试类里增加@Listeners({ExtentTestNGMethodInterceptor.class})
首先,先创建一个类ExtentTestNGMethodInterceptor 实现 IMethodInterceptor接口
public class ExtentTestNGMethodInterceptor implements IMethodInterceptor {
List<IMethodInstance> returnMethod = new ArrayList<IMethodInstance>();
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
// IMethodInstance 这个接口所返回的是所有测试方法或实例(所有方法都在里面)
// 将IMethodInstance对象的list 创建为迭代器
Iterator<IMethodInstance> tie = methods.iterator();
// 遍历
while (tie.hasNext()) {
IMethodInstance methon = tie.next();
// 带注释的TestNG方法
ITestNGMethod x = methon.getMethod();
// 判断这个方法时@注释描述的
if (x.isTest()) {
String methodname = x.getMethodName();
String sql = "select description,status,priority from tb_method where casename = '" + methodname + "' and status = 'true'";
List<Map<String, Object>> list = null;
try {
list = exeSqlApi("auto_test", sql);
if (list.size() > 0) {
Map<String, Object> map = list.get(0);
String priority = map.get("priority").toString();
String description = map.get("description").toString();
x.setDescription(description);
x.setPriority(Integer.parseInt(priority));
returnMethod.add(methon);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// return
return returnMethod;
}
}
其次,创建表,表结构如下:
最后,在测试类里增加监听
@Listeners({ExtentTestNGMethodInterceptor.class})
public class Bvt {
@Test
public void test(){
}
}