Концепция assertions в Cypress

Assertions (утверждения) в Cypress играют ключевую роль в проверке корректности работы веб-приложений. Они позволяют убедиться, что состояние страницы, элементы DOM и данные соответствуют ожидаемым значениям. Cypress интегрирует несколько типов assertions, опираясь на встроенную библиотеку Chai, а также предоставляет свои специфические методы проверки.


Типы assertions

1. Твердые (Explicit) Assertions

Твердые assertions напрямую проверяют состояние элемента или переменной. В Cypress они чаще всего реализуются через методы should и and.

cy.get('button#submit').should('be.visible');
cy.get('input[name="email"]').should('have.value', 'user@example.com');

Ключевые моменты:

  • should автоматически повторяется до тех пор, пока условие не выполнится или не истечет таймаут.
  • Можно комбинировать несколько проверок с помощью and:
cy.get('button#submit')
  .should('be.visible')
  .and('not.be.disabled');

2. Негативные (Negative) Assertions

Позволяют убедиться, что элемент или состояние не соответствуют заданному условию.

cy.get('div.error-message').should('not.exist');
cy.get('input[name="username"]').should('not.have.value', 'admin');

Примечание: Использование негативных проверок важно при тестировании отсутствия ошибок или неправильных данных.


3. Soft Assertions (нежесткие проверки)

Cypress не предоставляет soft assertions “из коробки”, но их можно реализовать через плагины или собственные функции, чтобы тест продолжал выполнение даже при падении проверки. Это полезно для комплексных форм, где необходимо проверить несколько полей одновременно.


Методы assertions в Cypress

should()

Основной метод для твердых assertions. Поддерживает встроенные цепочки и Chai-методы.

Примеры:

  • Проверка текста элемента:
cy.get('.alert').should('contain.text', 'Успешно сохранено');
  • Проверка наличия класса:
cy.get('#menu-item').should('have.class', 'active');
  • Проверка атрибута:
cy.get('img.logo').should('have.attr', 'src', '/images/logo.png');

and()

Позволяет соединять несколько assertions для одного элемента, создавая читаемую цепочку проверок.

cy.get('input#password')
  .should('be.visible')
  .and('have.attr', 'type', 'password')
  .and('not.be.disabled');

expect() и assert()

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

cy.request('/api/users').then((response) => {
  expect(response.status).to.eq(200);
  assert.isArray(response.body, 'Response is an array');
});

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

  • expect удобен для проверки отдельных значений.
  • assert позволяет использовать классический стиль тестирования с явным сообщением при падении проверки.

Assertions для работы с DOM

Cypress предоставляет множество встроенных методов для проверки состояния элементов:

Проверка Пример
Видимость cy.get('#submit').should('be.visible')
Существование cy.get('.modal').should('exist')
Отсутствие cy.get('.error').should('not.exist')
Текст cy.get('h1').should('contain.text', 'Главная')
Классы cy.get('#nav-item').should('have.class', 'active')
Атрибуты cy.get('img').should('have.attr', 'alt', 'Логотип')
Значение поля cy.get('input[name="email"]').should('have.value', 'test@example.com')

Assertions с асинхронными действиями

Cypress автоматически обрабатывает асинхронность через retry-логику. Методы should и and повторяют проверку до выполнения условия или истечения таймаута. Это позволяет писать надежные тесты без необходимости вручную управлять ожиданием.

cy.get('.notification')
  .should('be.visible')
  .and('contain.text', 'Данные успешно обновлены');

Пользовательские Assertions

Можно создавать собственные assertions через Chai-плагины или функции Cypress:

chai.use((_chai, utils) => {
  _chai.Assertion.addMethod('validEmail', function() {
    const email = utils.flag(this, 'object');
    this.assert(
      /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email),
      'expected #{this} to be a valid email',
      'expected #{this} not to be a valid email'
    );
  });
});

cy.wrap('user@example.com').should('be.validEmail');

Преимущества:

  • Повышает читаемость тестов.
  • Позволяет централизовать проверки специфичных бизнес-правил.

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

  • Всегда использовать chainable assertions для одного элемента, чтобы тест оставался компактным и читабельным.
  • Использовать should для DOM-проверок и expect/assert для данных API.
  • Комбинировать позитивные и негативные assertions для полноценного покрытия сценариев.
  • При проверке динамического контента полагаться на retry-логику Cypress, а не на ручные задержки.

Особенности Cypress в сравнении с другими фреймворками

  • Автоматическое повторение assertions до успеха.
  • Интеграция с Chai обеспечивает мощные возможности проверки текста, классов, атрибутов и значений.
  • Возможность создания кастомных методов проверки.
  • Полная синхронизация с асинхронными событиями, что уменьшает необходимость явных таймаутов.

Assertions в Cypress — это фундаментальная часть тестирования, обеспечивающая надежность проверки состояния элементов и данных. Правильное их использование делает тесты стабильными, читаемыми и поддерживаемыми.