Fixtures в Cypress представляют собой статические данные, которые используются для тестирования веб-приложений. Они позволяют отделить данные теста от его логики, обеспечивая более чистую и поддерживаемую структуру тестов. Чаще всего fixtures представляют собой файлы в формате JSON, но также могут быть YAML, CSV или просто текстовыми файлами.
По умолчанию Cypress ищет файлы fixtures в директории:
cypress/fixtures
Каждый файл в этой папке может быть использован в тестах через
команду cy.fixture().
Пример структуры папки:
cypress/
└── fixtures/
├── user.json
├── products.json
└── config.json
Для работы с 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)
})
Для удобства часто присваивают 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)
})
Такой подход полезен для тестирования функционала с уникальными значениями, например, регистрацией новых пользователей.
Fixtures активно применяются при тестировании API. Они позволяют заранее подготовить тело запроса или ожидаемый ответ:
cy.fixture('newUser.json').then((newUser) => {
cy.request('POST', '/api/users', newUser)
.its('status')
.should('eq', 201)
})
Использование fixtures для API запросов делает тесты предсказуемыми и облегчает поддержку.
Fixtures в Cypress являются фундаментальным инструментом для организации тестовых данных. Их правильное использование позволяет сделать тесты более стабильными, читаемыми и легко поддерживаемыми.