#java #datatable #cucumber #bdd
#java #datatable #cucumber #bdd
Вопрос:
Я использую Cucumber и Java для написания тестов BDD.
Я хотел перейти от использования таблиц данных в файлах функций, потому что у меня много полей, и они дублируются на несколько шагов, к использованию ссылки на таблицу со значениями. Из этого одного подхода:
GIVEN I created account with
| name | type |
| test | basic |
к подходу:
GIVEN I created account with account.table
файл account.table имеет значение:
| name | type |
| test | basic |
Я не знаю, как разобрать «путь к файлу с DataTable» на фактический «DataTable».
Я попытался написать шаг, подобный этому:
@GIVEN("^I created account with "([^"]*)"$")
public void createAccount(DataTable dataTable) { ... }
Но это не работает. Потому что нет автоматического преобразования пути к файлу в DataTable.
Вот ошибка:
cucumber.runtime.Исключение CucumberException: не знаете, как преобразовать «ресурсы тестовые данные учетная запись.таблица» в cucumber.api.DataTable. Попробуйте написать свой собственный конвертер: @cucumber.deps.com.thoughtworks.xstream.annotations.XStreamConverter(DataTableConverter.class )
Есть ли какие-либо примеры ее разбора или какие-либо идеи?
Комментарии:
1. Я думаю, вы можете использовать имя таблицы в виде строки на шаге cucumber, а в определении шага вы можете получить доступ к этой таблице из внешнего пути и выполнить необходимые операции.
2. Но как разобрать файл в DataTable? При первом подходе она анализируется автоматически.
3. Это сработало для первого подхода, потому что это встроенная функциональность cucumber. Но вы ищете что-то другое. Для этого вы можете передать имя таблицы в виде строки в пошаговом определении, используя эту
String argument
программу записи для чтения данных из.table
файла.
Ответ №1:
Сделал это с помощью следующего кода, но хотел что-то простое и из самого Cucumber box:
public void readFromExternalTable(String fileName) throws IOException {
List<String> lines = readLinesFromFile(fileName);
List<String> headers = getColumnsFromRow(lines.get(0));
List<String> values = getColumnsFromRow(lines.get(1));
DataTable table = createTable(headers, values);
}
static List<String> readLinesFromFile(String fileName) {
List<String> lines = new ArrayList<>();
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(fileName));
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return lines;
}
static List<String> getColumnsFromRow(String line) {
List<String> list = new ArrayList<>();
String[] row = line.split("\|");
for (int i = 1; i < row.length; i ) {
list.add(row[i].trim());
}
return list;
}
static <String> DataTable createTable(List<String> headers, List<String> values) {
List<List<String>> rawTable = new ArrayList<>();
rawTable.add(headers);
rawTable.add(values);
return DataTable.create(rawTable);
}
Ответ №2:
Вы можете использовать преимущества внешних тестовых данных и многое другое с QAF-BDD2. Он имеет встроенные поставщики данных и также поддерживает пользовательский поставщик данных. Приведенный ниже пример заключается в предоставлении данных из CSV.
@dataFile:resources/data/newuser.csv
Scenario: create new user
Комментарии:
1. Спасибо, я знал об этом. И я также мог бы перейти на JBehave, потому что у него также есть встроенная поддержка внешней таблицы данных, но в моем проекте у меня есть строгие ограничения на использование только Cucumber без дополнений.