如果使用通用dataProvider,则并行运行在TestNG中不起作用

时间:2018-07-28 19:48:26

标签: java selenium testng testng-dataprovider

我正在尝试并行运行我的Tests,如果我的dataProvider存在于与@Test相同的类中,则一切正常。

但是,如果我将DataProvider放在单独的类中,则并行运行有时会运行良好,有时会失败。

下面是我的通用数据提供者代码

@DataProvider(name = "dp",parallel=true)
public static Object[][] getData(Method m) {

    String sheetName = m.getName();

    int rows = excel.getRowCount(sheetName);

    int cols = excel.getColumnCount(sheetName);

    Object[][] data = new Object[rows - 1][1];

    Hashtable<String, String> table = null;

    for (int rowNum = 2; rowNum <= rows; rowNum++) { // 2

        table = new Hashtable<String, String>();

        for (int colNum = 0; colNum < cols; colNum++) {

            // data[0][0]
            table.put(excel.getCellData(sheetName, colNum, 1), excel.getCellData(sheetName, colNum, rowNum));
            data[rowNum - 2][0] = table;
        }

    }

    return data;

}

下面是我的@Test之一

@Test(dataProviderclass = TestUtil.class,name="dp")
public void doLogin1(HashTable<String,String>data) throws InterruptedException {

    openBrowserLaunchURL(data.get("browser"));

    HomePage homePage = new HomePage();
    homePage.gotoLogin().doSignIn(data.get("username"), data.get("password")).doLogout();

    quitBrowser();

}

1 个答案:

答案 0 :(得分:0)

TestNG需要在同一@Test本身中集成所有注释,该类包含@Test注释。

您可以做的是,使用通用的DataProvider代码:

您需要在每个类中定义DataProvider声明,并在其后的逻辑/代码中定义您可以在Separate方法中定义的方法,您可以在任何类中对其进行公开调用。

示例示例:

@DataProvider(name = "dp",parallel=true)
public static Object[][] getData(Method m) {
   return readerUtility.demogetData();    
}

普通读者类:

public class readerUtility {

  public Object[][] demogetData(){

  String sheetName = m.getName();

    int rows = excel.getRowCount(sheetName);
    int cols = excel.getColumnCount(sheetName);
    Object[][] data = new Object[rows - 1][1];

    Hashtable<String, String> table = null;
    for (int rowNum = 2; rowNum <= rows; rowNum++) { 

        table = new Hashtable<String, String>();
        for (int colNum = 0; colNum < cols; colNum++) {
            table.put(excel.getCellData(sheetName, colNum, 1),excel.getCellData(sheetName, colNum, rowNum));
            data[rowNum - 2][0] = table;
        }
    }
  return data;
  }
}