testNG多个数据提供者将数据传递给一个具有多种测试方法的类

时间:2018-04-06 12:51:20

标签: apache-poi testng testng-dataprovider

EDIT1:我有一个ExcelUtility.java类来从中获取单元格数据并将其传递给我的测试类中的测试方法。

我正在阅读1个excel文件。 excel文件有3个工作表。 每个工作表里面都有一个独特的工作台。 我有1个测试类。 测试类有3种测试方法。 测试类包含3个dataProviders。 所有dataProviders在工作表名称和工作表名称上都有所不同。

测试类中的测试以下列方式编写:

  @Test(priority = 0, dataProvider = "dp1")
    public void test01(String...strings){
 }
 @Test(priority = 1, dataProvider = "dp2")
    public void test02(String...strings){
 } 
 @Test(priority = 2, dataProvider = "dp3")
    public void test03(String...strings){
}

我有以下java类使用apache poi jars从XLSX文件中读取:

public class ExcelUtility {

        private static XSSFWorkbook ExcelWBook;
        private static XSSFSheet ExcelWSheet;

        /*
         * Set the File path, open Excel file
         * @params - Excel Path and Sheet Name
         */
        public static void setExcelFile(String path, String sheetName) throws Exception {
            try {
                // Open the Excel file
                FileInputStream ExcelFile = new FileInputStream(path);

                // Access the excel data sheet
                ExcelWBook = new XSSFWorkbook(ExcelFile);
                ExcelWSheet = ExcelWBook.getSheet(sheetName);
            } catch (Exception e) {
                throw (e);
            }
        }

        public static String[][] getTestData(String tableName) {
            String[][] testData = null;

            try {
                // Handle numbers and strings
                DataFormatter formatter = new DataFormatter();
                XSSFCell[] boundaryCells = findCells(tableName);
                XSSFCell startCell = boundaryCells[0];

                XSSFCell endCell = boundaryCells[1];

                int startRow = startCell.getRowIndex() + 1;
                int endRow = endCell.getRowIndex() - 1;
                int startCol = startCell.getColumnIndex() + 1;
                int endCol = endCell.getColumnIndex() - 1;

                testData = new String[endRow - startRow + 1][endCol - startCol + 1];

                for (int i=startRow; i<endRow+1; i++) {
                    for (int j=startCol; j<endCol+1; j++) {
                        // testData[i-startRow][j-startCol] = ExcelWSheet.getRow(i).getCell(j).getStringCellValue();
                        Cell cell = ExcelWSheet.getRow(i).getCell(j);
                        testData[i - startRow][j - startCol] = formatter.formatCellValue(cell);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return testData;
        }

        public static XSSFCell[] findCells(String tableName) {
            DataFormatter formatter = new DataFormatter();
            String pos = "begin";
            XSSFCell[] cells = new XSSFCell[2];

            for (Row row : ExcelWSheet) {
                for (Cell cell : row) {
                    // if (tableName.equals(cell.getStringCellValue())) {
                    if (tableName.equals(formatter.formatCellValue(cell))) {
                        if (pos.equalsIgnoreCase("begin")) {
                            cells[0] = (XSSFCell) cell;
                            pos = "end";
                        } else {
                            cells[1] = (XSSFCell) cell;
                        }
                    }
                }
            }
            return cells;
        }
    }

为了从excel文件中读取,我按以下方式组织了测试方法:

@DataProvider(name = "dp1")
    public Object[][] dp1() throws IOException {
        Object[][] testData = new Object[0][];
        try {
            ExcelUtility.setExcelFile(Constants.File_Path+Constants.File_Name, "Page1");
            testData = ExcelUtility.getTestData("P1");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return testData;
    }
    @DataProvider(name = "dp2")
    public Object[][] dp2() throws IOException {
        Object[][] testData = new Object[0][];
        try {
            ExcelUtility.setExcelFile(Constants.File_Path+Constants.File_Name, "Page2");
            testData = ExcelUtility.getTestData("P2");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return testData;
    }
    @DataProvider(name = "dp3")
    public Object[][] dp3() throws IOException {
        Object[][] testData = new Object[0][];
        try {
            ExcelUtility.setExcelFile(Constants.File_Path+Constants.File_Name, "Page3");
           testData = ExcelUtility.getTestData("P3");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return testData;
    }
    @Test(priority = 0, dataProvider = "dp1")
    public void test01(String...strings){
 //read data from excel and pass the value to the strings added as arguments in the method above
 }

 @Test(priority = 1, dataProvider = "dp2")
    public void test02(String...strings){

 }

 @Test(priority = 2, dataProvider = "dp3")
    public void test03(String...strings){

 }

我想做的是以下内容:

  1. 从sheet1读取第一行数据,将其传递给test1,继续test2

  2. 从sheet2读取第一行数据,将其传递给test2,继续测试3

  3. 从sheet3读取第一行数据,将其传递给test3,继续test1

  4. 从表1中读取第二行数据,将其传递给test1,继续测试2

  5. 依此类推,取决于Excel工作表中的行数。

    会发生什么:

    执行第一个测试,读取工作表1,第1行 执行第一个测试,读取工作表1,第2行 执行第二次测试,读取工作表2,第1行 执行第二个测试,读取工作表2,第2行。

    所有测试都失败了,因为它们彼此可靠,这就是我设置执行优先级的原因。

    我应该更改Test类中的某些内容,还是应该更改ExcelUtility.java类中的某些内容?

    提前谢谢!

1 个答案:

答案 0 :(得分:0)

查看与commit

相关的文件

它基于带有测试数据的xlsx创建testng.xml。