Подготовка тестовых данных

Значение тестовых данных

В автоматизированном тестировании корректные и предсказуемые тестовые данные являются фундаментом стабильности тестов. В контексте Cypress тестовые данные включают информацию, необходимую для взаимодействия с приложением: пользователи, продукты, заказы, формы ввода, конфигурации и состояния системы. Недостаточно просто создать тесты — их корректность напрямую зависит от данных, на которых они выполняются.

Источники тестовых данных

  1. Фиксированные данные в коде Простая стратегия — хранить тестовые данные прямо в тестовых файлах. Например, массив объектов с данными пользователей:

    const users = [
      { username: "user1", password: "Password123!" },
      { username: "user2", password: "SecurePass456!" }
    ];

    Преимущество: простота и скорость доступа. Недостаток: данные становятся статичными, что затрудняет тестирование разных сценариев или больших объемов данных.

  2. Файлы фикстур (fixtures) Cypress поддерживает использование файлов JSON, которые можно хранить в папке cypress/fixtures. Это позволяет отделить данные от логики теста:

    // users.json
    [
      { "username": "user1", "password": "Password123!" },
      { "username": "user2", "password": "SecurePass456!" }
    ]
    cy.fixture('users.json').then((users) => {
      cy.get('input[name=username]').type(users[0].username);
      cy.get('input[name=password]').type(users[0].password);
    });

    Такой подход повышает читаемость тестов и упрощает поддержку данных при изменении требований.

  3. Динамически генерируемые данные Для тестирования, где важно уникальное состояние (например, регистрация новых пользователей), используются библиотеки генерации данных, такие как faker или chance.

    import { faker } from '@faker-js/faker';
    
    const randomUser = {
      username: faker.internet.userName(),
      email: faker.internet.email(),
      password: faker.internet.password()
    };
    
    cy.get('input[name=username]').type(randomUser.username);
    cy.get('input[name=email]').type(randomUser.email);
    cy.get('input[name=password]').type(randomUser.password);

    Генерация данных снижает вероятность конфликтов при многократных запусках тестов и делает сценарии более реалистичными.

Инициализация состояния приложения

Для корректного тестирования необходимо приводить приложение в предсказуемое состояние перед выполнением теста. Cypress предлагает несколько стратегий:

  1. Использование API для подготовки данных Создание пользователей, товаров или других сущностей через REST API или GraphQL до запуска теста позволяет избежать длительной последовательности действий через интерфейс.

    cy.request('POST', '/api/users', { username: 'testUser', password: 'pass123' })
      .then((response) => {
        expect(response.status).to.eq(201);
      });

    Этот подход ускоряет тесты и делает их более устойчивыми к изменениям UI.

  2. Очистка и сброс состояния После каждого теста рекомендуется очищать созданные данные или возвращать базу данных в исходное состояние. Cypress позволяет выполнять команды перед каждым тестом через beforeEach или afterEach:

    beforeEach(() => {
      cy.request('POST', '/api/reset-database');
    });

    Это гарантирует, что тесты будут независимыми и повторяемыми.

Работа с конфиденциальными данными

Для тестирования аутентификации и других чувствительных операций часто требуются реальные учетные данные. В Cypress их удобно хранить в cypress.env.json или использовать переменные окружения.

{
  "adminUser": "admin",
  "adminPass": "Admin123!"
}
cy.get('input[name=username]').type(Cypress.env('adminUser'));
cy.get('input[name=password]').type(Cypress.env('adminPass'));

Такой подход предотвращает утечку данных и обеспечивает гибкость при запуске тестов в разных окружениях.

Практические рекомендации

  • Для каждого теста создавать уникальные данные, чтобы избежать конфликтов при параллельном выполнении.
  • Разделять данные и логику теста с использованием фикстур или генераторов.
  • Использовать API для подготовки и очистки данных вместо последовательности действий через UI, если это возможно.
  • Хранить конфиденциальные данные отдельно от репозитория.
  • Всегда проверять, что тестовые данные соответствуют текущей структуре приложения и бизнес-логике.

Выводы по подготовке данных

Подготовка тестовых данных в Cypress требует продуманного подхода: статические, динамические и API-инициализируемые данные комбинируются для обеспечения стабильности, повторяемости и гибкости тестов. Встроенные возможности фикстур, переменных окружения и генераторов данных позволяют поддерживать чистую архитектуру тестов и минимизировать ошибки, связанные с некорректными или устаревшими данными.