TestNG数据驱动框架如何从Excel参数取值设置动态测试用例名称
这个需求完全可以实现,根据你要的实际效果可以选两种方案实现:
方案1:调整数据提供层逻辑
你自研的DataDriven组件最终返回的是二维数组,只需要修改Excel读取逻辑,把你需要的测试用例名称(比如Excel对应列存储的用例名、按「方法名+行号」规则生成的标识)填充到二维数组每一行的第一个元素位置,测试方法执行时testName参数自然就能拿到对应的用例名称值。
如果你是要反过来把testName的取值作为该条数据驱动用例在测试报告里的显示名称,可以配合TestNG的ITest接口实现,不需要改动你现有数据驱动的逻辑:
// 测试类实现ITest接口 public class YourTest implements ITest { // 用ThreadLocal避免多线程执行时参数串扰 private ThreadLocal<String> currentTestName = new ThreadLocal<>(); @Test (DataDriven = "data") public void testCase(String testName, String testData1, String results){ // 把testName赋值给当前线程的成员变量 currentTestName.set(testName); String s = doSomething(testData1); // 注:你原示例的Assert.assertTrue参数不符合语法,这里按逻辑调整为assertEquals示例 Assert.assertEquals(s, results); } @Override public String getTestName() { // 返回自定义的用例名,测试报告/Listener中都会生效 return currentTestName.get(); } }
方案2:复用已有ITestListener实现
你已经在框架中集成了ITestListener的实现类,可以直接在Listener的回调方法里完成赋值,不需要修改测试类和数据提供层的代码:
@Override public void onTestStart(ITestResult result) { // 拿到当前测试方法的所有入参 Object[] params = result.getParameters(); if (params.length > 0 && params[0] instanceof String) { String testName = (String) params[0]; // 操作1:直接把testName设置为当前用例的方法名,报告里会显示 result.getMethod().setMethodName(testName); // 操作2:把testName存到框架上下文,测试方法里可以直接从上下文取值 YourFrameworkContext.setCurrentTestName(testName); } }
额外提示:你给出的示例代码里有两处语法错误:参数类型
Sting应为String,Assert.assertTrue方法第一个入参要求是boolean类型,直接传字符串会编译报错。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

