TestNG runner quando si utilizza @DataProvider combinato con apache poi non esegue i test in modo sequenziale

-3

EDIT: ho una classe ExcelUtility.java per ottenere dati dalla cella e trasmetterla ai metodi di test nella mia classe di test.

Sto leggendo da 1 file excel. Il file excel ha 3 fogli di lavoro. Ogni foglio di lavoro ha 1 tavolo di lavoro unico all'interno. Ho 1 lezione di prova. La classe di test ha 3 metodi di test. La classe di test contiene 3 dataProvider. Tutti i dataprovider si differenziano per il nome del foglio di lavoro e il nome della tabella di lavoro.

I test nella classe di test sono scritti nel modo seguente:

  @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){
}

Ho la seguente classe java per leggere dal file XLSX usando apache poi jars:

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;
        }
    }

Per leggere dal file excel ho organizzato i metodi di test nel modo seguente:

@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){

 }

Quello che vorrei fare è il seguente:

  1. Leggi i dati della prima riga da sheet1, passa a test1, continua a test2

  2. Leggi i dati della prima riga da sheet2, passa a test2, continua a test3

  3. Leggi i dati della prima riga da sheet3, passa a test3, continua a test1

  4. Leggi i dati della seconda riga del foglio 1, passa a test1, continua a test2

E così via, a seconda del numero di righe nei fogli Excel.

Quello che succede è:

Il primo test viene eseguito, legge il foglio di lavoro 1, riga 1.
Il primo test viene eseguito, legge il foglio di lavoro 1, riga 2.
Il secondo test viene eseguito, legge il foglio di lavoro 2, riga 1.
Il secondo test viene eseguito, legge il foglio di lavoro 2, riga 2.

Tutti i test falliscono perché sono affidabili l'uno dall'altro, ecco perché ho impostato la priorità di esecuzione.

Dovrei cambiare qualcosa nella classe Test, o qualcosa nella classe ExcelUtility.java dovrebbe essere cambiato?

Grazie in anticipo!

    
posta me2me2you2me 08.04.2018 - 18:10
fonte

1 risposta

0

TestNG consente di specificare l'ordine dei test con diversi approcci . Tuttavia, stai facendo qualcosa che non è allineato con la metodologia di test delle unità.

Dovresti riscrivere i test per eseguire una serie di controlli sui dati del test. Quello che chiami test1 e test2 sono in realtà assertion1 e assertion2 .

@Test(dataProvider = "dp1")
public void newTest1(String dp1) throws Exception {
  assertion1(dp1);
  assertion2(dp1);
}

@Test(dataProvider = "dp2")
public void newTest2(String dp2) throws Exception {
  assertion2(dp2);
  assertion3(dp2);
}

Con questo approccio, i test possono essere eseguiti in qualsiasi ordine. Mentre pensavi ai dati gestiti in una pipeline, non è così che operano i framework di test delle unità.

Inoltre non sei costretto ad avere una sola asserzione in un test unitario. Se ci sono zeloti religiosi che riesaminano il tuo codice, suggerirei di comporre quei metodi di asserzione in assertion1and2 , ecc., In modo che il test stesso appaia solo in una affermazione.

    
risposta data 08.04.2018 - 18:25
fonte

Leggi altre domande sui tag