Использование cy.fixture()

cy.fixture() является встроенным методом Cypress, предназначенным для работы с фикстурными данными — заранее подготовленными файлами, содержащими тестовые данные в формате JSON, текст, CSV или других поддерживаемых форматах. Этот метод позволяет отделять данные теста от его логики, обеспечивая более чистый, повторно используемый и масштабируемый код тестов.


Подключение и структура фикстур

Фикстуры размещаются в папке cypress/fixtures. Каждый файл может содержать данные в формате JSON или текстовые данные. Структура JSON-файла может быть произвольной, но рекомендуется использовать объектное представление, чтобы легко обращаться к отдельным элементам данных.

Пример файла user.json:

{
  "name": "Иван",
  "email": "ivan@example.com",
  "roles": ["admin", "editor"]
}

Файл message.txt может содержать простой текст:

Привет, это тестовое сообщение.

Основной синтаксис cy.fixture()

Метод cy.fixture() возвращает объект Cypress.Chainable, который позволяет использовать результат асинхронно через .then() или присвоить алиас через .as() для дальнейшего использования в тестах.

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

cy.fixture('user').then((user) => {
  expect(user.name).to.equal('Иван')
  expect(user.roles).to.include('admin')
})

В этом примере Cypress загружает данные из файла cypress/fixtures/user.json и передает объект в колбэк.


Использование алиасов для фикстур

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

cy.fixture('user').as('userData')

cy.get('@userData').then((user) => {
  cy.log(`Email пользователя: ${user.email}`)
})

Алиасы позволяют обращаться к данным через @имяАлиаса в любом месте теста или в хуках before, beforeEach.


Асинхронная природа и цепочки команд

Важно учитывать, что cy.fixture() возвращает цепочку Cypress, а не сам объект сразу. Прямое присваивание значения переменной вне .then() не сработает:

let userData
cy.fixture('user').then((data) => {
  userData = data
})
// console.log(userData) здесь будет undefined

Правильный способ — работать с данными внутри .then() или через алиасы.


Передача фикстур в запросы API

cy.fixture() часто используется для отправки подготовленных данных в POST или PUT запросах:

cy.fixture('user').then((user) => {
  cy.request({
    method: 'POST',
    url: '/api/users',
    body: user
  }).then((response) => {
    expect(response.status).to.eq(201)
  })
})

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


Динамическая загрузка разных файлов

Можно загружать фикстуры динамически, используя переменные:

const fileName = 'user'
cy.fixture(`${fileName}.json`).then((data) => {
  cy.log(data.email)
})

Это удобно при тестировании с множеством наборов данных или при параметризованных тестах.


Работа с текстовыми и другими форматами

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

cy.fixture('message.txt').then((text) => {
  expect(text).to.contain('тестовое сообщение')
})

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


Совмещение фикстур с before и beforeEach

Для повторного использования данных удобно загружать фикстуры в хук before или beforeEach:

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

it('проверка имени пользователя', function() {
  expect(this.userData.name).to.equal('Иван')
})

Использование function() вместо стрелочной функции необходимо для корректного доступа к контексту this, где сохраняются алиасы.


Рекомендации по использованию

  • Разделять фикстуры по типам данных и функциональным блокам (users.json, products.json, messages.txt).
  • Использовать алиасы для упрощения доступа к данным в нескольких тестах.
  • Загружать большие или общие фикстуры в хуке before для оптимизации тестов.
  • Проверять структуру фикстур и валидировать данные перед использованием, чтобы избежать ошибок во время выполнения.
  • Для сложных сценариев с множественными вложенными объектами JSON использовать глубокие проверки через chai (deep.equal, include.keys).

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