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:
-
Leggi i dati della prima riga da sheet1, passa a test1, continua a test2
-
Leggi i dati della prima riga da sheet2, passa a test2, continua a test3
-
Leggi i dati della prima riga da sheet3, passa a test3, continua a test1
-
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!