使用第一行dataprovider

时间:2018-04-25 06:47:10

标签: java selenium selenium-webdriver testng dataprovider

设定:

  1. 我有一个测试课。
  2. 此测试类有几种带@Test(dataProvider = "getData")注释的方法。
  3. 数据中有7条记录(行)。
  4. 所有测试都是连续的。
  5. 问题:

    我需要使用一行数据运行所有方法(测试),但截至目前,它继续对所有行重复相同的测试,即如果有7行数据则测试1将运行7次然后进行第二次测试将开始,第二次测试也是如此,等等。

    我希望所有测试都针对第1行运行,然后所有测试再次针对第2行运行。

    我正在使用Apache poi API从ms-excel表中读取数据。 Java,testng和Selenium在Windows上自动化浏览器。

    我访问过以下链接但未获得实施: https://dzone.com/articles/testng-run-tests-sequentially

2 个答案:

答案 0 :(得分:2)

Factory允许动态创建测试。

假设这是当前的设置......

SequentialTest.java - 示例部分

@Test(dataProvider="dp")
public void firstTest(int id, String account) {
    System.out.println("Test #1 with data: "+id+". "+account);
}

Data.java - 示例部分

@DataProvider(name="dp")
public static Object[][] dataProvider() {
    Object[][] dataArray = { {1, "user1"}, {2, "user2"} };
    return dataArray;
}

也许你有同一类的数据提供者。

testng.xml - 相关部分

< test name = "checks">
   < classes >
      < class name="....Sequential" />
   < /classes >
< /test>

根据文章,类和xml中需要进行更改。

SequentialTest.java - 为之前传递给测试方法的每个参数创建实例变量。 使用实例变量创建构造函数。 从Test annotation中删除dataprovider部件。 从测试方法中删除参数。

private int id;
private String account;

public SequentialTest(int id, String account) {
    this.id = id;
    this.account = account;
}

@Test
public void firstTest() {
    System.out.println("Test #1 with data: "+id+". "+account);
    assertTrue(true);
}

Data.java - 需要将dataprovider方法分成单独的类(如果还没有)并将工厂方法添加到其中。数据提供者保持不变。

@Factory(dataProvider="dp")
    public Object[] createInstances(int id, String account) {
        return new Object[] {new SequentialTest(id, account)};
}

testng.xml - 删除现有部分。只需要提及包含Factory方法的类的名称。最重要的是添加group-by-instances="true"参数,它将为您提供所需的行为。

  < test name="fact" group-by-instances="true">
      < classes>
          < class name="....Data"/>
      < classes/>
  < /test>

答案 1 :(得分:0)

在编写数据提供者时,可以向数据提供者添加属性“索引”。对于前

//Define the index you want to return it to. Here it will return first row
@DataProvider(name = "dataProviderSample", indices = {0})
public Object[][] getSelectedData() {
    return getInputData();
}

// Write your logic to generate data form excel/csv/json/xml inside the below method
private static Object[][] getInputData() {
    return new Object[][]{{"Sample1", "Sample1", "Sample1"},
            {"Sample2", "Sample2", "Sample2"},
            {"Sample3", "Sample3", "Sample3"},
            {"Sample4", "Sample5", "Sample5"}
    };
}

通过上述方法,您可以在测试方法中传递预期的索引。

@Test(dataProvider = "dataProviderSample")
void testDataProvider(String fname, String lName, String num) {
    System.out.println(fname);
    System.out.println(lName);
    System.out.println(num);
}

因此,通过使用此方法,您可以在所有测试方法中一次传递一行。但是如果你想在测试方法中传递所有的dataprovider行。