Организация тестовых данных

Эффективное тестирование с помощью Cypress невозможно без продуманной организации тестовых данных. Тестовые данные определяют поведение приложения в автоматизированных сценариях и напрямую влияют на надежность и повторяемость тестов.

Структуры тестовых данных

В Cypress тестовые данные обычно представляют собой объекты JavaScript или JSON-файлы. Стандартный подход включает разделение данных на:

  • Статические данные — фиксированные значения, используемые во всех тестах. Например, конфигурации пользователей, адреса или предопределенные параметры форм.
  • Динамические данные — создаются во время выполнения теста или при подготовке окружения. Например, генерация случайных email, идентификаторов заказов или токенов аутентификации.

Пример статических данных:

// cypress/fixtures/users.json
{
  "admin": {
    "username": "admin_user",
    "password": "admin_pass"
  },
  "guest": {
    "username": "guest_user",
    "password": "guest_pass"
  }
}

Пример использования в тесте:

cy.fixture('users').then((users) => {
  cy.login(users.admin.username, users.admin.password)
})

Организация фикстур

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

  • Разделять фикстуры по типам данных: пользователи, продукты, заказы.
  • Использовать вложенные структуры JSON для комплексных объектов.
  • Избегать дублирования данных между фикстурами.

Использование команд для подготовки данных

Cypress поддерживает создание пользовательских команд в файле cypress/support/commands.js. Они помогают стандартизировать подготовку данных и уменьшить дублирование кода.

Пример команды для логина пользователя:

Cypress.Commands.add('login', (username, password) => {
  cy.request({
    method: 'POST',
    url: '/api/login',
    body: { username, password }
  }).then((resp) => {
    window.localStorage.setItem('authToken', resp.body.token)
  })
})

Команды можно комбинировать с фикстурами:

cy.fixture('users').then((users) => {
  cy.login(users.guest.username, users.guest.password)
})

Генерация динамических данных

Для тестирования сценариев с уникальными значениями необходимо создавать динамические данные. Обычно используют библиотеки вроде faker или uuid.

Пример генерации случайного email:

import { faker } from '@faker-js/faker'

const randomEmail = faker.internet.email()
cy.get('#email').type(randomEmail)

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

Cypress.env('orderId', newOrder.id)

Подготовка данных через API

Cypress позволяет взаимодействовать с серверной частью напрямую через HTTP-запросы, что ускоряет подготовку тестовой среды.

Пример создания нового пользователя через API:

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

Такой подход уменьшает зависимость от UI и повышает скорость выполнения тестов.

Очистка данных после теста

Поддержание чистоты данных критично для повторяемости тестов. Используют несколько стратегий:

  • Удаление через API после завершения теста:

    cy.request('DELETE', `/api/users/${userId}`)
  • Использование хуков after и afterEach для сброса состояния:

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

Организация данных для разных окружений

Cypress позволяет конфигурировать данные в зависимости от окружения (development, staging, production) через cypress.config.js и env переменные.

Пример конфигурации:

export default defineConfig({
  e2e: {
    env: {
      baseUrl: 'https://staging.example.com',
      adminUser: 'admin_staging'
    }
  }
})

Использование данных в тестах:

cy.visit(Cypress.env('baseUrl'))
cy.login(Cypress.env('adminUser'), 'password')

Итоговые принципы

  • Статические и динамические данные следует хранить отдельно.
  • Фикстуры и пользовательские команды упрощают повторное использование данных.
  • Динамические значения и API-запросы ускоряют подготовку тестовой среды.
  • Очистка данных после тестов обеспечивает стабильность сценариев.
  • Переменные окружения позволяют гибко управлять данными для разных сред.

Такая организация тестовых данных делает тесты Cypress надежными, повторяемыми и легкими в сопровождении.