← Назад к вопросам

Как работать с таблицами данных в Cucumber?

2.0 Middle🔥 111 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с таблицами данных в Cucumber: стратегии и техники

Cucumber, как инструмент для поддержки поведения на основе Behavior-Driven Development (BDD), предоставляет мощные механизмы для работы со структурированными данными, особенно через таблицы. Это позволяет описывать сложные сценарии с множеством параметров в удобном, читаемом формате. Основной инструмент для этого — Data Tables.

Основные типы таблиц и их обработка

В Cucumber таблицы данных могут использоваться двумя основными способами:

  1. Список списков (List<List<String>>) — когда таблица передается как сырые строковые данные.
  2. Список объектов (List<Map<String, String>> или List<Pojo>) — когда таблица преобразуется в коллекцию более сложных структур.

Пример таблицы в сценарии Gherkin

Feature: Управление пользователями

  Scenario: Добавление нескольких пользователей
    Given есть система пользователей
    When я добавляю следующих пользователей:
      | Имя       | Email              | Роль      |
      | Иван Петров | ivan@example.com | Администратор |
      | Мария Сидорова | maria@example.com | Пользователь   |
      | Алексей Иванов | alex@example.com | Модератор   |
    Then все пользователи должны быть сохранены в системе

Преобразование таблиц в код Java/Kotlin

Ключевой элемент — использование аннотации @DataTableType или конвертеров для автоматического преобразования строк таблицы в объекты вашей доменной модели.

1. Использование List<Map<String, String>>

Наиболее простой способ — получить таблицу как карты (ключ-значение). Ключом является заголовок столбца.

@When("я добавляю следующих пользователей:")
public void addUsers(List<Map<String, String>> usersTable) {
    for (Map<String, String> row : usersTable) {
        String name = row.get("Имя");
        String email = row.get("Email");
        String role = row.get("Роль");
        // Создание и добавление объекта User в систему
        User user = new User(name, email, role);
        userService.add(user);
    }
}

2. Преобразование в список объектов (POJO) с @DataTableType

Это более чистый и поддерживаемый подход. Вы регистрируете конвертер, который преобразует строку таблицы в объект.

// Определение модели
public class User {
    private String name;
    private String email;
    private String role;

    // Конструктор, геттеры, сеттеры...
}

// В классе шагов (Step Definitions)
@DataTableType
public User convertUserEntry(Map<String, String> entry) {
    return new User(
        entry.get("Имя"),
        entry.get("Email"),
        entry.get("Роль")
    );
}

@When("я добавляю следующих пользователей:")
public void addUsers(List<User> users) {
    for (User user : users) {
        userService.add(user);
    }
}

3. Работа с таблицами без заголовков

Если таблица не имеет заголовков (просто список значений), она будет представлена как List<List<String>>.

When я добавляю пользователей с данными:
  | Иван Петров | ivan@example.com | Администратор |
  | Мария Сидорова | maria@example.com | Пользователь   |
@When("я добавляю пользователей с данными:")
public void addUsersWithoutHeaders(List<List<String>> usersData) {
    for (List<String> row : usersData) {
        User user = new User(row.get(0), row.get(1), row.get(2));
        userService.add(user);
    }
}

Продвинутые техники и лучшие практики

  • Трансформация данных: Используйте конвертеры для преобразования строк в сложные типы (даты, числа, перечисления). Например, @DataTableType для преобразования строки "Администратор" в enum Role.ADMIN.
  • Проверка данных: Таблицы идеально подходят для этапа Then, где можно сравнивать ожидаемое состояние системы с фактическим, используя таблицы как ожидаемый результат.
@Then("список пользователей должен быть:")
public void verifyUsers(List<User> expectedUsers) {
    List<User> actualUsers = userService.getAll();
    assertThat(actualUsers).containsExactlyElementsOf(expectedUsers);
}
  • Каскадные таблицы: Для описания сложных объектов с вложенными структурами. Это требует более сложных конвертеров или использования ObjectMapper.
  • Динамическое создадание данных: Таблицы можно комбинировать с концепцией Примеров (Examples) в Scenario Outline для параметризации сценариев.
Scenario Outline: Добавление пользователя с различными ролями
  Given есть система пользователей
  When я добавляю пользователя с именем <Имя> и ролью <Роль>
  Then пользователь должен быть сохранен с ролью <Роль>

  Examples:
    | Имя       | Роль         |
    | Иван      | Администратор |
    | Мария     | Пользователь   |

Инструменты и библиотеки

Для сложных преобразований можно использовать:

  • Cucumber DataTables API (встроенные методы asList, asMap, convert).
  • Jackson или Gson для преобразования таблиц в JSON и далее в POJO (для очень сложных структур).
  • Custom TableTransformer для реализации полностью кастомной логики преобразования.

Заключение

Работа с таблицами данных в Cucumber — это мощный способ сделать ваши BDD сценарии выразительными и поддерживаемыми. Ключевой выбор — между простыми List<Map> для быстрых задач и преобразованием в POJO через @DataTableType для долгосрочных, чистых решений. Это не только улучшает читаемость спецификаций, но и напрямую связывает их с объектами доменной модели в коде автоматизации, уменьшая усилия на преобразование данных и снижая вероятность ошибок.

Как работать с таблицами данных в Cucumber? | PrepBro