Группировка тестов

Группировка тестов является важным аспектом организации автоматизированного тестирования, особенно при работе с крупными проектами. Cypress предоставляет гибкие инструменты для структурирования тестов, что облегчает поддержку, повторное использование кода и управление зависимостями между тестами.

describe: создание логических блоков

Ключевым инструментом группировки является функция describe. Она позволяет объединять связанные тесты в один логический блок. Это удобно для разделения тестов по функциональным модулям, страницам или компонентам приложения.

describe('Авторизация пользователя', () => {
    it('должна успешно входить с правильными данными', () => {
        cy.visit('/login');
        cy.get('#username').type('user');
        cy.get('#password').type('password');
        cy.get('button[type="submit"]').click();
        cy.url().should('include', '/dashboard');
    });

    it('должна показывать ошибку при неправильном пароле', () => {
        cy.visit('/login');
        cy.get('#username').type('user');
        cy.get('#password').type('wrongpassword');
        cy.get('button[type="submit"]').click();
        cy.get('.error-message').should('be.visible');
    });
});

Особенности describe:

  • Может содержать вложенные блоки describe, что позволяет создавать иерархию тестов.
  • Позволяет добавлять хуки (before, beforeEach, after, afterEach) для настройки и очистки состояния перед или после группы тестов.

it: определение отдельных тестов

Функция it используется для описания конкретного тестового сценария. Название теста должно быть информативным и отражать проверяемое поведение.

it('должен отображать корректное приветствие после входа', () => {
    cy.login('user', 'password'); // кастомная команда
    cy.get('.welcome-message').should('contain', 'Привет, user');
});

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

  • Тесты должны быть атомарными, проверять только одно поведение.
  • Каждый it должен быть независимым: порядок выполнения тестов не должен влиять на результаты.

Вложенные группы тестов

Cypress поддерживает вложенные блоки describe, что позволяет детализировать структуру тестов. Например, для страницы профиля можно создать блоки для разных разделов: личные данные, настройки безопасности, уведомления.

describe('Профиль пользователя', () => {
    describe('Личные данные', () => {
        it('должны корректно отображаться', () => {
            cy.visit('/profile');
            cy.get('#name').should('have.value', 'Иван');
        });
    });

    describe('Настройки безопасности', () => {
        it('должны позволять смену пароля', () => {
            cy.visit('/profile/security');
            cy.get('#new-password').type('newPass123');
            cy.get('button.save').click();
            cy.get('.success-message').should('be.visible');
        });
    });
});

Преимущества вложенных блоков:

  • Ясная структура и удобная навигация по отчетам.
  • Возможность централизованного применения хуков на уровне блока, что уменьшает дублирование кода.

Хуки для группировки

Для настройки тестовой среды внутри группы describe используются хуки:

  • before() — выполняется один раз перед всеми тестами блока.
  • beforeEach() — выполняется перед каждым тестом блока.
  • afterEach() — выполняется после каждого теста блока.
  • after() — выполняется один раз после всех тестов блока.
describe('Корзина', () => {
    before(() => {
        cy.visit('/shop');
        cy.clearCart();
    });

    beforeEach(() => {
        cy.addItemToCart('product-1');
    });

    afterEach(() => {
        cy.clearCart();
    });

    it('должна отображать добавленный товар', () => {
        cy.get('.cart-item').should('have.length', 1);
    });

    it('должна корректно подсчитывать сумму', () => {
        cy.get('.cart-total').should('contain', '1000');
    });
});

Хуки позволяют избегать дублирования кода, обеспечивая повторяемость и предсказуемость тестов.

.only и .skip: управление выполнением

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

  • describe.only() — выполняется только этот блок и его вложенные тесты.
  • describe.skip() — блок и его тесты пропускаются.
  • Аналогично применяются к it: it.only(), it.skip().
describe('Тесты профиля', () => {
    it.only('проверка отображения аватара', () => {
        cy.visit('/profile');
        cy.get('.avatar').should('be.visible');
    });

    it('проверка отображения email', () => {
        cy.visit('/profile');
        cy.get('#email').should('have.value', 'user@example.com');
    });
});

Практические рекомендации

  • Разделение на блоки должно соответствовать структуре приложения или функциональности.
  • Избегать слишком глубоких вложений describe, чтобы отчеты оставались читаемыми.
  • Использовать хуки для подготовки данных и очистки состояния, а не для логики тестов.
  • Названия блоков и тестов должны быть осмысленными и краткими, отражать проверяемое поведение.

Грамотно организованные группы тестов упрощают поддержку, ускоряют отладку и делают отчеты Cypress информативными, особенно при интеграции с CI/CD.