Что такое fixtures

Fixtures в Cypress представляют собой статические данные, которые используются для тестирования веб-приложений. Они позволяют отделить данные теста от его логики, обеспечивая более чистую и поддерживаемую структуру тестов. Чаще всего fixtures представляют собой файлы в формате JSON, но также могут быть YAML, CSV или просто текстовыми файлами.

Хранение fixtures

По умолчанию Cypress ищет файлы fixtures в директории:

cypress/fixtures

Каждый файл в этой папке может быть использован в тестах через команду cy.fixture().

Пример структуры папки:

cypress/
 └── fixtures/
      ├── user.json
      ├── products.json
      └── config.json

Использование fixtures

Для работы с fixtures используется команда cy.fixture(), которая загружает данные из указанного файла и возвращает их в виде объекта или строки (в зависимости от формата).

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

describe('Тест с фикстурами', () => {
  it('Проверка данных пользователя', () => {
    cy.fixture('user.json').then((user) => {
      cy.visit('/login')
      cy.get('#username').type(user.username)
      cy.get('#password').type(user.password)
      cy.get('button[type="submit"]').click()
    })
  })
})

В этом примере данные пользователя берутся из файла user.json. Это позволяет легко менять тестовые данные без изменения самого теста.

Асинхронная природа

cy.fixture() возвращает промис, поэтому работа с данными должна выполняться внутри метода then(). Cypress обеспечивает корректное управление асинхронностью, что исключает необходимость использования async/await.

Поддержка разных форматов

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

import Papa from 'papaparse'

cy.fixture('products.csv').then((csvString) => {
  const products = Papa.parse(csvString, { header: true }).data
  cy.log(products.length)
})

Fixtures и alias

Для удобства часто присваивают alias данным fixtures, чтобы обращаться к ним внутри нескольких тестов:

beforeEach(() => {
  cy.fixture('user.json').as('userData')
})

it('Логин с использованием alias', function() {
  cy.visit('/login')
  cy.get('#username').type(this.userData.username)
  cy.get('#password').type(this.userData.password)
  cy.get('button[type="submit"]').click()
})

Использование alias делает тесты чище и уменьшает дублирование кода.

Динамическое использование данных

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

cy.fixture('user.json').then((user) => {
  const modifiedUser = {
    ...user,
    username: `test_${Date.now()}`
  }
  cy.get('#username').type(modifiedUser.username)
})

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

Интеграция с API тестами

Fixtures активно применяются при тестировании API. Они позволяют заранее подготовить тело запроса или ожидаемый ответ:

cy.fixture('newUser.json').then((newUser) => {
  cy.request('POST', '/api/users', newUser)
    .its('status')
    .should('eq', 201)
})

Использование fixtures для API запросов делает тесты предсказуемыми и облегчает поддержку.

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

  • Использовать отдельный fixture для каждого набора данных.
  • Не хранить чувствительные данные в открытом виде.
  • Присваивать alias для повторного использования в тестах.
  • Комбинировать с динамическими данными для тестов, требующих уникальности.
  • Использовать JSON по умолчанию, а для других форматов применять парсеры.

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