Как использовать внешнюю таблицу данных в Cucumber?

#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 без дополнений.