在之前https://blog.csdn.net/xing_gy/article/details/138345397文章中通过Java反射在测试方法中向ITestContext对象当中添加属性,然后再监听报错时再去获取实现。但是在后续使用中发现如果配置了失败重试,执行时失败重试时会报错java.lang.IllegalArgumentException,也没有开启数据驱动的并发parallel属性
经测试发现在数据驱动中开启失败重试以及在测试方法传入了ITestContext context就会报这个错。
本次更换逻辑通过ITestResult的tr.getMethod().setDescription()方法在测试用例开始时去修改description值。
先创建判断是否是数据驱动@DataProvider执行的方法以及是否开启了并发方法
private boolean isDataProviderDriven(ITestResult tr) {
try {
// 判断是否是DataProviderDriven
Method method = tr.getMethod().getConstructorOrMethod().getMethod();
if (method != null && method.isAnnotationPresent(Test.class)) {
Test testAnnotation = method.getAnnotation(Test.class);
if (testAnnotation != null) {
String dataProviderName = testAnnotation.dataProvider();
if (!dataProviderName.isEmpty()) {
// 获取 TestNG 的 DataProvider 方法是否开启了数据驱动的并发,
for (Method dpMethod : method.getDeclaringClass().getMethods()) {
if (dpMethod.isAnnotationPresent(DataProvider.class)) {
DataProvider dpAnnotation = dpMethod.getAnnotation(DataProvider.class);
String dpName = dpAnnotation.name();
// 如果 dpName 为空,则使用 dpMethod 名称进行比较
if (dpName.isEmpty()) {
dpName = dpMethod.getName();
}
if (dpName.equals(dataProviderName)) {
return !dpAnnotation.parallel();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
再在onTestStart()中实现具体的修改description值的逻辑
1.一个入参时:
是数组取第一个值
是Map取name的值
都不是转为String取值
2.多个参数时:
取第一个参数转为String取值
@Override
public void onTestStart(ITestResult tr) {
//判断是否是DataProviderDriven
if(isDataProviderDriven(tr)){
Object[] parameters = tr.getParameters();
//如果是一个入参
if (parameters.length == 1) {
Object param = parameters[0];
//如果是Map类型
if (param instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> paramMap = (Map<String, Object>) param;
if (paramMap.containsKey("name")) {
//修改用例名称为获取的name的值
tr.getMethod().setDescription(paramMap.get("name").toString());
}
//如果是Object数组类型
}else if (param instanceof Object[]) {
Object[] arrayParam = (Object[]) param;
if (arrayParam.length > 0) {
//修改用例名称为获取的第一个参数的值
tr.getMethod().setDescription(arrayParam[0].toString());
}
//如果是其他类型
}else {
tr.getMethod().setDescription(parameters[0].toString());
}
//如果是多个参数
} else if (parameters.length > 1) {
//修改用例名称为获取的第一个参数的值
tr.getMethod().setDescription(parameters[0].toString());
}
}
}