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

时间:2014-05-07 14:24:32

标签: java selenium selenium-webdriver testng

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

我有一个测试用例,其中我有时想要使用VISA卡,有时还想使用万事达卡。

是否可以将参数传递给@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但找不到任何对我有用的内容。它建议将Method m作为参数传递给数据提供者,但我找不到一个有用的方法。

提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

在数据提供者中阅读此属性。

答案 1 :(得分:0)

  1. 如果您只想测试数据的子集,可以在数据提供商中对其进行过滤。

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

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

  4. 底线:

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

    2. 如果您想针对不同的数据子集运行不同的测试,那么您应该选择多个数据提供商