Cypress предоставляет удобные инструменты для работы с данными в формате JSON, что позволяет хранить тестовые данные отдельно от тестового кода и динамически подгружать их при выполнении тестов. Использование JSON-файлов улучшает читаемость тестов и облегчает поддержку больших наборов данных.
Для загрузки данных из JSON-файлов используется команда
cy.fixture(). По умолчанию Cypress ищет файлы в папке
cypress/fixtures. Пример базового подключения:
cy.fixture('user.json').then((user) => {
cy.log(user.name)
cy.log(user.email)
})
Ключевые моменты:
.json можно опустить, Cypress автоматически
его подставляет..then().JSON-файлы часто применяются для хранения:
Пример теста с использованием данных из JSON:
describe('Тестирование формы логина', () => {
it('Вводит данные из JSON', () => {
cy.fixture('credentials').then((creds) => {
cy.get('#username').type(creds.username)
cy.get('#password').type(creds.password)
cy.get('button[type="submit"]').click()
cy.url().should('include', '/dashboard')
})
})
})
Здесь JSON-файл credentials.json может выглядеть
так:
{
"username": "testuser",
"password": "password123"
}
before и beforeEachЧтобы избежать повторного вызова cy.fixture() в каждом
тесте, данные можно загружать один раз в хуке before:
let userData;
before(() => {
cy.fixture('user').then((data) => {
userData = data
})
})
it('Проверка имени пользователя', () => {
cy.get('#user-name').should('contain', userData.name)
})
Преимущества:
JSON может содержать сложные структуры: массивы объектов, вложенные объекты. Обращение к ним выполняется стандартными способами:
cy.fixture('products').then((products) => {
products.items.forEach((item) => {
cy.log(item.name)
cy.log(item.price)
})
})
Пример JSON-файла:
{
"items": [
{ "name": "Laptop", "price": 1200 },
{ "name": "Smartphone", "price": 800 }
]
}
Для удобства Cypress поддерживает работу с Lodash-подобными методами для фильтрации и поиска объектов:
cy.fixture('products').then((products) => {
const expensive = products.items.find(item => item.price > 1000)
cy.log(expensive.name)
})
JSON-файлы часто применяются для передачи данных в POST-запросах API:
cy.fixture('newUser').then((user) => {
cy.request({
method: 'POST',
url: '/api/users',
body: user
}).then((response) => {
expect(response.status).to.eq(201)
})
})
Такой подход обеспечивает повторяемость тестов и позволяет легко менять набор данных без изменения тестового кода.
Можно комбинировать данные из JSON с динамически сгенерированными значениями:
cy.fixture('user').then((user) => {
const updatedUser = {
...user,
email: `test+${Date.now()}@example.com`
}
cy.log(updatedUser.email)
})
Преимущества:
requireДля случаев, когда асинхронная загрузка через
cy.fixture() неудобна, можно использовать стандартный
Node.js метод require:
const user = require('../. ./fixtures/user.json')
cy.log(user.name)
Отличия от cy.fixture():
Использование JSON-файлов в Cypress обеспечивает гибкость и масштабируемость тестов, упрощает поддержку большого объема данных и позволяет строить надежные и повторяемые сценарии для веб-приложений и API.