当前位置: 首页 > 知识库问答 >
问题:

为TestNG工厂提供数据提供程序来调用测试方法——无法多次调用测试

傅志文
2023-03-14

我使用了test dat provider和factory来处理示例数据,更像是从具有多个值的excel行中读取数据。因此,每个映射表示每行的列名和值,并将其添加到列表中,以获得从excel读取的所有值。现在我返回列表的对象[][

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 };

}

}

我看到当我使用返回new Object[]{new HashMap

我已经研究了所有可能的解决方案,但找不到任何具体的方法

这是我得到的输出。

[RemoteTestNG] detected TestNG version 6.14.3
In data provider
In Factory
ID is 1
[{2=Two, 3=Three}, {31=Three1, 21=Two1}]

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


共有1个答案

皇甫雨石
2023-03-14

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

你可以把它作为:

return new Object[][]{ {hash_map}, {hash_map1}};

或者,如果列表中有很多映射,或者列表是从不同的源填充的,那么您可以执行以下流操作(如果您使用的是java 8或更高版本)。(如果您使用的是低于java 8的版本,那么您可以使用for循环来执行相同的操作)

在数据提供者的末尾:

return check.stream()
            .map(m -> new Object[] { m } )
            .toArray(Object[][]::new);

您可以将测试修改为:

@Test(dataProvider = "create")
public void test(HashMap<String, String> map) {
    System.out.println("ID is " + Thread.currentThread().getId());
    System.out.println(map);
}
 类似资料:
  • 我正在使用@DataProvider使用TestNG 6.14.3Java编写单元测试 我想实现的目标: 我想为每个数据提供程序案例命名 我所尝试的: > 我添加了一个额外的参数并遵循了此指南,问题是现在我在每个我不想要的测试中都有一个未使用的参数。 创建一个忽略第一个参数的自定义数据提供程序注释,这不起作用,因为我找不到将其与TestNG集成的方法。 我的问题: 是否有一种内置的方式为测试用例提

  • 我正在使用TestNG和Java运行测试 这是在https://www.tutorialspoint.com/testng/testng_parameterized_test.htm 错误是这样说的:[Utils][ERROR][错误]org.testng.TestNGExc0019:@Test on method addProjectWork需要参数'url',但未在C:\用户\SStaple\

  • 问题内容: 我目前正在做我的第一个Java项目,并且希望完全TDD。我正在使用JUnit编写测试。显然,JUnit不提供对数据提供程序的支持,这使得使用20个不同版本的参数测试同一方法变得很烦人。支持数据提供者的Java最受欢迎/最标准的测试工具是什么?我遇到过TestNG,但不知道它有多受欢迎,或与替代品相比如何。 如果有一种方法可以使这种行为成为使用JUnit的好方法,那么这也可能会起作用。

  • 我有以下问题 我有一个带有随机名称的测试,我必须记录我从数据提供者提供的两个测试参数。 我实现了一种方法,通过将它们连接到名称中,将它们记录为自定义处理的测试参数。 然而,TestNG还添加了未处理的参数(它们看起来像是随机生成的代码,带有包/类的名称和其他内容,如下图所示)。 是否有任何方法可以删除TestNG记录的数据提供程序测试参数?或者我可以用自定义数据提供程序测试参数覆盖它们吗? 顺便说

  • 有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗? 我找到了这个解决方案:https://gist.github.com/ae6rt/3805639 但是,它没有考虑到数据提供者可能是: 在完全不同的类别中定义,或 在父类中定义,并且 该方法可以是静态的,也可以是非静态的 我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然T

  • 目前,我有一个测试类,它有多个方法,所有方法都使用相同的数据提供程序。每次testng循环使用不同的方法时,它都会重新计算数据提供程序方法。有没有办法让数据提供程序运行一次? 谢谢 杰森