【问题标题】:Is it possible to pass parameters to TestNG's @DataProvider?是否可以将参数传递给 TestNG 的 @DataProvider?
【发布时间】:2014-05-07 14:24:31
【问题描述】:

我有一个 Excel 电子表格,其中存储了所有测试信用卡。这些信用卡有不同的类型。其中一些是 VISA,另一些是 MasterCard、Amex 等......

我有一个测试案例,我有时想使用 VISA 卡,有时想使用 MasterCard 卡。

是否可以将参数传递给@DataProvider?

这是我的 @DataProvider 代码:

@DataProvider(name="dpCreditCards")
public Object[][] getCreditCards() {
    Object[][] testData = null;
    try {
        FileInputStream fis = new FileInputStream(dir);
        XSSFWorkbook workbook = new XSSFWorkbook(fis);

        XSSFSheet worksheet = workbook.getSheet("Credit Cards");
        String type = "";
        String cardNumber = "";
        int numOfRows = worksheet.getPhysicalNumberOfRows();
        int j = 0;
        if (numOfRows > 0) {

            for (int i = 1; i < numOfRows; i++) {
                XSSFRow r = worksheet.getRow(i);                
                if (r.getCell(0).getCellType() == Cell.CELL_TYPE_NUMERIC) {
                    type = Integer.toString((int)r.getCell(0).getNumericCellValue());
                } else if (r.getCell(0).getCellType() == Cell.CELL_TYPE_STRING) {
                    type = r.getCell(0).getStringCellValue();       
                }

                if (type.equalsIgnoreCase("visa"))
                    j++;
            }

            testData = new Object[j][1];
        }

        for (int i = 1; i < numOfRows; i++) {
            XSSFRow r = worksheet.getRow(i);                
            if (r.getCell(0).getCellType() == Cell.CELL_TYPE_NUMERIC) {
                type = Integer.toString((int)r.getCell(0).getNumericCellValue());
            } else if (r.getCell(0).getCellType() == Cell.CELL_TYPE_STRING) {
                type = r.getCell(0).getStringCellValue();       
            }

            if (type.equalsIgnoreCase("visa")) {
                if (r.getCell(1).getCellType() == Cell.CELL_TYPE_NUMERIC) {
                    cardNumber = Integer.toString((int)r.getCell(1).getNumericCellValue());
                } else if (r.getCell(1).getCellType() == Cell.CELL_TYPE_STRING) {
                    cardNumber = r.getCell(1).getStringCellValue();     
                }

                testData[i-1][0] = cardNumber;
            }               
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }   

    return testData;
}

我已经检查了这个链接:http://testng.org/doc/documentation-main.html#parameters-dataproviders,但找不到任何适合我的东西。它建议将方法 m 作为参数传递给数据提供者,但我找不到 m 具有的有用方法。

提前致谢

【问题讨论】:

  • 您不能以您想要的方式将参数传递给提供者。相反,您可能会将您的数据提供者考虑为不同卡类型的单独方法,然后使用选择不同卡类型提供者的测试方法。
  • @BobDalgleish 你建议使用方法名来解析数据吗?如果是,我的方法名称对于所有情况都是相同的。
  • 没有。我建议您适当地重构测试方法,以便您可以选择将哪些实际测试应用于哪些数据。
  • 也许这会有所帮助? stackoverflow.com/questions/21290122/…
  • @user1058106 这解决了我的问题。谢谢!!!

标签: java selenium selenium-webdriver testng


【解决方案1】:

一种方法是读取侦听器中的参数,然后设置可在数据提供者中使用的属性。

实施 ITestListener 或 ISuiteListener,具体取决于您构建测试的方式。在 any 的 onStart 方法中设置全局 card 属性或 threadlocal 属性(同样取决于您如何顺序/并行运行测试)。

在您的数据提供程序中读取此属性。

【讨论】:

    【解决方案2】:
    1. 如果您只想测试数据的子集,可以在数据提供程序中将其过滤掉。

    2. 如果您想对不同的数据子集应用不同的测试,那么您可以为每种测试方法使用不同的数据提供者。或者您可以使用 tbe Method 参数来决定从您的数据提供者返回哪些数据。

    3. 如果您希望能够配置在运行时为测试加载的数据类型,您可以为此使用环境变量/系统属性。

    底线:

    1. 如果您对不同的数据子集运行相同的测试,则有多种方法可以指定要检查的子集

    2. 如果您想为不同的数据子集运行不同的测试,那么您可能应该使用多个数据提供者

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2015-07-08
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多