Fixtures в Cypress представляют собой статические файлы с данными,
которые удобно использовать для тестирования различных сценариев. Обычно
они хранятся в папке cypress/fixtures и могут быть в
формате JSON, CSV, или даже простого текстового файла. Переиспользование
fixtures позволяет централизованно управлять тестовыми данными, повышая
читаемость и поддерживаемость тестов.
Для удобства лучше структурировать папку fixtures по
типам данных. Например:
cypress/
└─ fixtures/
├─ users.json
├─ products.json
└─ auth.json
Такое разделение облегчает повторное использование данных в разных тестах.
Cypress предоставляет метод cy.fixture(), который
загружает данные из файла и возвращает их в виде объекта. Пример
использования:
describe('Тест с использованием fixture', () => {
it('Проверка логина', () => {
cy.fixture('auth').then((authData) => {
cy.visit('/login');
cy.get('#username').type(authData.username);
cy.get('#password').type(authData.password);
cy.get('button[type="submit"]').click();
cy.url().should('include', '/dashboard');
});
});
});
Особенности метода cy.fixture():
then.fixtures.Для повышения эффективности лучше загружать fixture один раз перед
всеми тестами или в beforeEach.
describe('Тестирование пользователей', () => {
let users;
before(() => {
cy.fixture('users').then((data) => {
users = data;
});
});
it('Регистрация нового пользователя', () => {
cy.visit('/register');
cy.get('#name').type(users.newUser.name);
cy.get('#email').type(users.newUser.email);
cy.get('#password').type(users.newUser.password);
cy.get('button[type="submit"]').click();
cy.contains('Регистрация успешна').should('be.visible');
});
it('Логин существующего пользователя', () => {
cy.visit('/login');
cy.get('#username').type(users.existingUser.username);
cy.get('#password').type(users.existingUser.password);
cy.get('button[type="submit"]').click();
cy.url().should('include', '/dashboard');
});
});
В этом примере данные fixture загружаются один раз в
before(), что позволяет использовать их в любом тесте
внутри блока describe. Это снижает дублирование кода и
ускоряет выполнение тестов.
Fixture можно комбинировать с генерацией данных на лету. Например, данные из JSON можно модифицировать перед использованием:
cy.fixture('users').then((users) => {
const tempUser = { ...users.newUser, email: `user${Date.now()}@example.com` };
cy.visit('/register');
cy.get('#name').type(tempUser.name);
cy.get('#email').type(tempUser.email);
cy.get('#password').type(tempUser.password);
cy.get('button[type="submit"]').click();
cy.contains('Регистрация успешна').should('be.visible');
});
Такой подход позволяет использовать один и тот же fixture для нескольких тестов, создавая уникальные данные там, где это необходимо.
Для более масштабного проекта можно создавать кастомные команды Cypress, которые автоматически подгружают fixture и выполняют нужные действия:
Cypress.Commands.add('loginAs', (userKey) => {
cy.fixture('auth').then((auth) => {
const user = auth[userKey];
cy.visit('/login');
cy.get('#username').type(user.username);
cy.get('#password').type(user.password);
cy.get('button[type="submit"]').click();
});
});
// Использование в тесте
describe('Тестирование авторизации', () => {
it('Логин админом', () => {
cy.loginAs('admin');
cy.url().should('include', '/dashboard');
});
});
Такой подход делает тесты более читаемыми и минимизирует дублирование кода, особенно при работе с множеством пользователей или ролей.
before или
beforeEach, если данные должны быть свежими.Эффективное использование fixtures позволяет создавать тесты, которые легко поддерживать, масштабировать и переиспользовать, снижая вероятность ошибок при изменении данных или структуры приложения.