如何针对Household对象列表及嵌套颜色列表重复执行测试?
问题:TestNG中如何基于Household对象批量执行多阶段测试?
我从CSV文件生成了一组Household类型的对象,每个对象包含String类型的name属性和List类型的colours属性。我希望对列表中的每个Household对象重复执行以下测试:
@Test(priority = 1) void test1(String name){ // 断言逻辑 } @Test(priority =2) void test2(String colour){ // 断言逻辑 }
举个例子:如果有一个Household对象,Name = Chair,colours = [pink,yellow,blue],我需要用name='chair'执行一次test1,再针对列表中的每个颜色分别执行test2,并且所有Household对象都要执行这个逻辑。
我尝试用TestNG的DataProvider实现,但不知道怎么构造数据来覆盖每个对象及其下的所有颜色:
@DataProvider public Object[][] data() throws CsvValidationException, IOException, URISyntaxException { CSV reader = new CSV(); houseHoldObjects = reader.getHouseHoldObjects(); return new Object[][] { { } }; }
解决方案1:拆分两个DataProvider分别驱动测试
这种方式简单直接,先让所有test1执行(优先级为1),再执行所有test2(优先级为2):
private List<Household> houseHoldObjects; // 初始化Household列表,仅在测试类启动时执行一次 @BeforeClass public void setUp() throws CsvValidationException, IOException, URISyntaxException { CSV reader = new CSV(); houseHoldObjects = reader.getHouseHoldObjects(); } // 给test1提供所有Household的name数据 @DataProvider(name = "householdNames") public Object[][] provideHouseholdNames() { List<Object[]> dataList = new ArrayList<>(); for (Household household : houseHoldObjects) { dataList.add(new Object[]{household.getName()}); } return dataList.toArray(new Object[0][]); } // 给test2提供所有颜色数据,附带household name方便排查问题 @DataProvider(name = "householdColours") public Object[][] provideHouseholdColours() { List<Object[]> dataList = new ArrayList<>(); for (Household household : houseHoldObjects) { for (String colour : household.getColours()) { dataList.add(new Object[]{household.getName(), colour}); } } return dataList.toArray(new Object[0][]); } @Test(priority = 1, dataProvider = "householdNames") public void test1(String name) { // 你的断言逻辑,比如验证name非空 assertNotNull(name, "Household名称不能为空"); // 其他测试逻辑 } @Test(priority = 2, dataProvider = "householdColours") public void test2(String householdName, String colour) { // 你的断言逻辑,比如验证颜色格式 assertNotNull(colour, householdName + "的颜色不能为空"); // 其他测试逻辑 }
解决方案2:保证单个Household的test1执行完再跑其test2
如果需要严格保证同一个Household的test1执行完成后,再执行该对象下的所有test2,可以用TestNG的@Factory模式,为每个Household创建独立的测试实例:
public class HouseholdTestFactory { @Factory(dataProvider = "householdData") public Object[] createTestInstances(Household household) { // 每个Household对应一个测试实例 return new Object[]{new HouseholdTestCase(household)}; } @DataProvider(name = "householdData") public Object[][] provideHouseholdData() throws CsvValidationException, IOException, URISyntaxException { CSV reader = new CSV(); List<Household> households = reader.getHouseHoldObjects(); Object[][] data = new Object[households.size()][1]; for (int i = 0; i < households.size(); i++) { data[i][0] = households.get(i); } return data; } // 内部测试类,每个实例对应一个Household public static class HouseholdTestCase { private final Household household; public HouseholdTestCase(Household household) { this.household = household; } @Test(priority = 1) public void test1() { String name = household.getName(); // 断言逻辑 assertNotNull(name); } @Test(priority = 2, dependsOnMethods = "test1") public void test2() { for (String colour : household.getColours()) { // 对每个颜色执行测试逻辑 assertNotNull(colour); // 其他断言 } } } }
内容的提问来源于stack exchange,提问作者Lemonand09
相关产品推荐
相关产品推荐

