Java 为TestNG工厂提供数据提供程序以调用测试方法-无法多次调用测试

Java 为TestNG工厂提供数据提供程序以调用测试方法-无法多次调用测试,java,selenium,testng,testng-dataprovider,testng-eclipse,Java,Selenium,Testng,Testng Dataprovider,Testng Eclipse,我使用测试数据提供程序和工厂处理样本数据,更像是从具有多个值的excel行中读取数据。所以,每个映射表示每行的列名和值,并将其添加到列表中,以获得从excel读取的所有值。 现在我返回列表的对象[][],因此在工厂中它必须在同一个签名中。 在这里,如果我将每个列表映射,那么只有实例可以执行。是否有一种方法可以为每个列表索引返回HashMap,以便根据arraylist的大小执行测试方法 public class TestNG { ArrayList<HashMap<String, S

我使用测试数据提供程序和工厂处理样本数据,更像是从具有多个值的excel行中读取数据。所以,每个映射表示每行的列名和值,并将其添加到列表中,以获得从excel读取的所有值。 现在我返回
列表的
对象[][]
,因此在工厂中它必须在同一个签名中。 在这里,如果我将每个列表映射,那么只有实例可以执行。是否有一种方法可以为每个列表索引返回
HashMap
,以便根据arraylist的大小执行测试方法

public class TestNG {
ArrayList<HashMap<String, String>> natives;
@DataProvider(name = "create")
public static Object[][] createData() {
    System.out.println("In data provider");
    ArrayList<HashMap<String, String>> check = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> hash_map = new HashMap<String, String>();
    hash_map.put("2", "Two");
    hash_map.put("3", "Three");
    check.add(hash_map);
    HashMap<String, String> hash_map1 = new HashMap<String, String>();
    hash_map1.put("21", "Two1");
    hash_map1.put("31", "Three1");
    check.add(hash_map1);
    return new Object[][] { { check } };
}

@Test
public void test() {
    System.out.println("ID is " + Thread.currentThread().getId());
    System.out.println(natives);
}

@Factory(dataProvider = "create", dataProviderClass = TestNG.class)
public Object[] checking1(ArrayList<HashMap<String, String>> map) {
    System.out.println("In Factory");
    natives = map;
    return new Object[] { natives };

}

所以,测试方法只调用一次,因为我们在整体上通过了列表,这是可以理解的。但希望它执行的次数等于列表长度。有更好的方法吗?

实际上,在这种情况下,似乎不需要
工厂
方法。由于整个列表作为单个测试用例传递,因此测试只执行一次。您需要将列表转换为一个
对象[][]
,其中每个测试用例都是一个
映射

您可以将其传递为:

return new Object[][]{ {hash_map}, {hash_map1}};
或者,如果列表中有很多映射,或者列表是从不同的源填充的,那么您可以执行以下流操作(如果您使用的是Java8或更高版本)。(如果您使用的是低于Java8的版本,那么您可以使用for循环来执行相同的操作)

在数据提供程序的末尾:

返回check.stream()
.map(m->新对象[]{m})
.toArray(对象[]:[]::新建);
不使用工厂,您可以将测试修改为:

@Test(dataProvider=“create”)
公共无效测试(HashMap){
System.out.println(“ID是”+Thread.currentThread().getId());
系统输出打印项次(map);
}

是的,上面一个就行了。但是我使用工厂的原因是,假设存在其他注释,如BeforeClass、BeforeMethod等,那么每次我都需要为测试数据运行这些方法中的每一个。所以在这种情况下我需要工厂。这就是为什么要在脚本中使用它。@SriramS无论如何,通过在数据提供程序中转换上述数据,它也可以与factory一起工作。这是绝对正确的。但想象一下,在这种情况下,我有课前和课后方法以及测试方法。场景01-只有数据提供者(假设返回了两个映射列表),它将在类之前调用一次,类之后调用一次,测试方法调用两次(因为我们有两个数据)。场景02-工厂从数据提供者处获取值,使得类前、类后和测试方法都要运行两次。所以场景02是我想要实现的。这就是为什么有工厂在这里place@SriramS对于场景2,如果使用
Factory
是“仅”用于每个测试用例的课前/课后运行,那么我建议使用
beforethod
AfterMethod
return new Object[][]{ {hash_map}, {hash_map1}};