Cypress предоставляет встроенные хуки, позволяющие управлять жизненным циклом тестов. Они используются для подготовки состояния перед выполнением тестов и очистки после них. Правильное использование хуков упрощает поддержку тестового кода и повышает его стабильность.
beforeХук before выполняется один раз перед всеми
тестами в блоке describe. Он применяется для
действий, которые необходимо выполнить один раз на весь набор тестов:
установка окружения, аутентификация, загрузка данных.
describe('Работа с формой авторизации', () => {
before(() => {
cy.visit('/login');
cy.fixture('users.json').as('usersData'); // загрузка фикстуры один раз
});
it('Проверка успешного входа', function () {
cy.get('input[name="username"]').type(this.usersData.validUser.username);
cy.get('input[name="password"]').type(this.usersData.validUser.password);
cy.get('button[type="submit"]').click();
cy.url().should('include', '/dashboard');
});
it('Проверка неуспешного входа', function () {
cy.get('input[name="username"]').type(this.usersData.invalidUser.username);
cy.get('input[name="password"]').type(this.usersData.invalidUser.password);
cy.get('button[type="submit"]').click();
cy.contains('Неверные учетные данные').should('be.visible');
});
});
Ключевые моменты использования
before:
describe.beforeEachХук beforeEach выполняется перед каждым
тестом внутри блока describe. Используется для
подготовки состояния перед каждым тестом: сброс базы данных, очистка
формы, установка начальных значений.
describe('Тестирование корзины', () => {
beforeEach(() => {
cy.visit('/shop');
cy.clearCookies();
cy.clearLocalStorage();
});
it('Добавление товара в корзину', () => {
cy.get('.product').first().click();
cy.get('button.add-to-cart').click();
cy.get('.cart-count').should('contain', '1');
});
it('Удаление товара из корзины', () => {
cy.get('.product').first().click();
cy.get('button.add-to-cart').click();
cy.get('.cart-count').should('contain', '1');
cy.get('.cart-item-remove').click();
cy.get('.cart-count').should('contain', '0');
});
});
Особенности beforeEach:
beforeEach —
внутренний будет выполняться после внешнего.afterХук after выполняется один раз после всех
тестов внутри блока describe. Используется для
глобальной очистки ресурсов: удаление тестовых данных, завершение
сессий, закрытие соединений.
describe('Управление пользователями', () => {
before(() => {
cy.loginAdmin(); // один раз логинимся как администратор
});
after(() => {
cy.deleteTestUsers(); // один раз удаляем созданных пользователей
});
it('Создание нового пользователя', () => {
cy.createUser({ username: 'testUser', password: '1234' });
cy.contains('Пользователь создан').should('be.visible');
});
});
Рекомендации по использованию
after:
afterEach.afterEachХук afterEach выполняется после каждого
теста внутри блока describe. Применяется для
восстановления состояния после теста: очистка данных, удаление временных
файлов, сброс cookies.
describe('Форма обратной связи', () => {
beforeEach(() => {
cy.visit('/feedback');
});
afterEach(() => {
cy.clearLocalStorage();
});
it('Отправка корректной формы', () => {
cy.get('input[name="email"]').type('user@example.com');
cy.get('textarea[name="message"]').type('Тестовое сообщение');
cy.get('button[type="submit"]').click();
cy.contains('Спасибо за ваше сообщение').should('be.visible');
});
it('Попытка отправки пустой формы', () => {
cy.get('button[type="submit"]').click();
cy.contains('Поле обязательно для заполнения').should('be.visible');
});
});
Особенности afterEach:
beforeEach для полной
изоляции тестов.Cypress поддерживает вложенные хуки, и порядок их
выполнения определяется иерархией блоков describe:
before внешнего блокаbefore внутреннего блокаbeforeEach внешнего блокаbeforeEach внутреннего блокаafterEach внутреннего блокаafterEach внешнего блокаafter внутреннего блокаafter внешнего блокаЭто позволяет строить сложные сценарии с различными уровнями подготовки и очистки.
before и after для действий,
которые нужны один раз на весь блок тестов.beforeEach и afterEach применять для
изоляции тестов, чтобы исключить зависимость одного
теста от другого.cy.fixture) для повторного
использования тестовых данных.Хуки в Cypress позволяют создать чистую и предсказуемую среду тестирования, минимизировать побочные эффекты и ускорить процесс разработки автоматизированных тестов.