如何在TestNG中获取带多值DataProvider的测试方法完整名称
解决TestNG中获取带DataProvider标识的测试方法名问题
我来帮你搞定这个问题!目前你的tearDown方法里只能拿到纯方法名Payment,要让它带上DataProvider的相关信息,可以通过TestNG提供的API来实现,下面给你两种可行的方案:
首先先看你的原始代码:
@DataProvider(name = "Payment") public static Object[][] Payment() { return new Object[][] { { "TC_001", "Payment 1" }, { "TC_002", "Payment 2" } }; } @Test(enabled = true, dataProvider = "Payment") public void Payment(String testCaseNumber, String testDesc) throws Exception { } @AfterMethod public void tearDown(ITestResult result) { testMethodName = result.getMethod().getMethodName(); }
问题:当前
testMethodName仅返回Payment,期望它能返回带有DataProvider名称的形式(比如Payment[Payment-TC_001])
方案一:用ThreadLocal存储测试用例信息,拼接自定义名称
这种方式适合需要灵活组合信息的场景,步骤如下:
- 定义一个
ThreadLocal变量来存储当前执行的测试用例编号(因为TestNG是多线程执行,ThreadLocal能保证线程安全) - 在测试方法里把DataProvider传入的
testCaseNumber存入ThreadLocal - 在
tearDown方法里获取方法名、DataProvider名称和测试用例编号,拼接成你想要的格式
修改后的代码:
// 线程安全的变量,存储当前测试用例编号 private ThreadLocal<String> currentTestCase = new ThreadLocal<>(); @DataProvider(name = "Payment") public static Object[][] Payment() { return new Object[][] { { "TC_001", "Payment 1" }, { "TC_002", "Payment 2" } }; } @Test(enabled = true, dataProvider = "Payment") public void Payment(String testCaseNumber, String testDesc) throws Exception { // 把当前测试用例编号存入ThreadLocal currentTestCase.set(testCaseNumber); } @AfterMethod public void tearDown(ITestResult result) { // 获取基础方法名 String baseMethodName = result.getMethod().getMethodName(); // 从@Test注解里拿到DataProvider的名称 String dpName = result.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class).dataProvider(); // 获取当前测试用例编号 String testCaseNum = currentTestCase.get(); // 拼接成期望的格式,比如 "Payment[Payment-TC_001]" testMethodName = String.format("%s[%s-%s]", baseMethodName, dpName, testCaseNum); // 及时移除ThreadLocal的值,避免内存泄漏 currentTestCase.remove(); }
方案二:利用TestNG的描述信息自定义名称
这种方式更简洁,直接在测试方法里设置测试结果的描述,然后在tearDown里读取:
@Test(enabled = true, dataProvider = "Payment") public void Payment(String testCaseNumber, String testDesc) throws Exception { // 获取当前测试方法的@Test注解,拿到DataProvider名称 String dpName = this.getClass().getMethod("Payment", String.class, String.class) .getAnnotation(Test.class).dataProvider(); // 自定义测试结果的描述,把需要的信息都加进去 Reporter.getCurrentTestResult().setDescription( String.format("%s[%s-%s]", "Payment", dpName, testCaseNumber) ); } @AfterMethod public void tearDown(ITestResult result) { // 直接读取我们自定义的描述作为方法名 testMethodName = result.getDescription(); }
两种方案都能实现你想要的效果,你可以根据自己的需求选择其中一种~
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

