TestNG如何为传入test1的所有参数运行对应的依赖测试test2
解决方案
TestNG 支持两种方案实现类级别的参数化,让test2跟随每组test1的参数独立执行:
方案1:@Factory + 构造函数注入(推荐)
该方案会为每组参数创建独立的测试类实例,实例内所有测试方法共享同一份参数,逻辑更清晰:
import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Factory; import org.testng.annotations.Test; public class ParamTest { // 存储当前实例对应参数 private Integer inputNumber; private Boolean expectedResult; // Factory标注构造函数,自动注入DataProvider返回的每组参数 @Factory(dataProvider = "param1") public ParamTest(Integer inputNumber, Boolean expectedResult) { this.inputNumber = inputNumber; this.expectedResult = expectedResult; } @Test public void test1() { System.out.println("test1 运行参数:" + inputNumber + " " + expectedResult); Assert.assertEquals(expectedResult, Boolean.TRUE); } // 仅当前实例的test1运行通过后,才会执行当前实例的test2 @Test(dependsOnMethods = "test1") public void test2() { System.out.println("test2 运行参数:" + inputNumber); // 此处可正常使用共享参数执行业务逻辑 Assert.assertEquals(Boolean.FALSE, Boolean.TRUE); } @DataProvider(name = "param1") private static Object[][] jobRequests() { return new Object[][]{{2, true}, {6, true}, {19, true}, {22, true}, {23, true}}; } }
运行效果
5组参数各对应一条独立的测试链路,每组链路依次执行test1→test2,互相独立不干扰。
方案2:test2绑定同一DataProvider
如果不想修改类结构,直接给test2也绑定同一个DataProvider即可,TestNG会自动按参数组匹配依赖关系:
@Test(dataProvider = "param1") public void test1(Integer inputNumber, Boolean expectedResult) { System.out.println(inputNumber + " " + expectedResult); Assert.assertEquals(expectedResult, Boolean.TRUE); } // 仅同组参数对应的test1执行通过后,才会触发当前组参数的test2执行 @Test(dataProvider = "param1", dependsOnMethods = "test1") public void test2(Integer inputNumber, Boolean expectedResult) { System.out.println("test2 运行参数:" + inputNumber); Assert.assertEquals(Boolean.FALSE, Boolean.TRUE); } @DataProvider(name = "param1") private static Object[][] jobRequests() { return new Object[][]{{2, true}, {6, true}, {19, true}, {22, true}, {23, true}}; }
内容的提问来源于stack exchange,提问作者JavageekGod
相关产品推荐
相关产品推荐

