Я попытался передать тестовые данные в виде ArrayList>, где HashMap - это пара имя-значение столбца, но TestNG не примет это, поскольку HashMap не может быть приведен как Object [].
TestNG может очень хорошо работать с методом, управляемым данными, который использует Map
в качестве параметра, который подается поставщиком данных.Приведенный ниже пример должен прояснить это.
В этом примере у меня есть таблица Excel, в которой есть лист с именем «53799150» и данные которого выглядят как ниже
+------------+------------+-------------+-----------------+
| TestcaseId | RollNumber | StudentName | StudentLocation |
+------------+------------+-------------+-----------------+
| 1 | S1001 | Po | Bengaluru |
| 2 | S1002 | Oogway | Chennai |
| 3 | S1003 | Shifu | Delhi |
| 4 | S1004 | TaiLung | Kolkata |
+------------+------------+-------------+-----------------+
.Пример ниже работает с показанными выше данными в виде карты:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class MapPoweredDataProviderSample {
private static final String FILE = "src/test/resources/53799150.xlsx";
private static final DataFormatter dataFormatter = new DataFormatter();
private static final String SHEET_NAME = "53799150";
@Test(dataProvider = "dp")
public void testMethod(Map<String, String> data) {
System.err.println(data);
}
@DataProvider(name = "dp")
public Object[][] getData() throws IOException, InvalidFormatException {
Workbook workbook = WorkbookFactory.create(new File(FILE));
Sheet sheet = workbook.getSheet(SHEET_NAME);
Iterable<Row> rows = sheet::rowIterator;
List<Map<String, String>> results = new ArrayList<>();
boolean header = true;
List<String> keys = null;
for (Row row : rows) {
List<String> values = getValuesInEachRow(row);
if (header) {
header = false;
keys = values;
continue;
}
results.add(transform(keys, values));
}
return asTwoDimensionalArray(results);
}
private static Object[][] asTwoDimensionalArray(List<Map<String, String>> interimResults) {
Object[][] results = new Object[interimResults.size()][1];
int index = 0;
for (Map<String, String> interimResult : interimResults) {
results[index++] = new Object[] {interimResult};
}
return results;
}
private static Map<String, String> transform(List<String> names, List<String> values) {
Map<String, String> results = new HashMap<>();
for (int i = 0; i < names.size(); i++) {
String key = names.get(i);
String value = values.get(i);
results.put(key, value);
}
return results;
}
private static List<String> getValuesInEachRow(Row row) {
List<String> data = new ArrayList<>();
Iterable<Cell> columns = row::cellIterator;
for (Cell column : columns) {
data.add(dataFormatter.formatCellValue(column));
}
return data;
}
}
Вот вывод:
{TestcaseId=1, RollNumber=S1001, StudentName=Po, StudentLocation=Bengaluru}
{TestcaseId=2, RollNumber=S1002, StudentName=Oogway, StudentLocation=Chennai}
{TestcaseId=3, RollNumber=S1003, StudentName=Shifu, StudentLocation=Delhi}
{TestcaseId=4, RollNumber=S1004, StudentName=TaiLung, StudentLocation=Kolkata}
===============================================
Default Suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================