Assertions (утверждения) в Cypress играют ключевую роль в проверке корректности работы веб-приложений. Они позволяют убедиться, что состояние страницы, элементы DOM и данные соответствуют ожидаемым значениям. Cypress интегрирует несколько типов assertions, опираясь на встроенную библиотеку Chai, а также предоставляет свои специфические методы проверки.
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 “из коробки”, но их можно реализовать через плагины или собственные функции, чтобы тест продолжал выполнение даже при падении проверки. Это полезно для комплексных форм, где необходимо проверить несколько полей одновременно.
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 позволяет использовать классический стиль
тестирования с явным сообщением при падении проверки.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') |
Cypress автоматически обрабатывает асинхронность через
retry-логику. Методы should и
and повторяют проверку до выполнения условия или истечения
таймаута. Это позволяет писать надежные тесты без необходимости вручную
управлять ожиданием.
cy.get('.notification')
.should('be.visible')
.and('contain.text', 'Данные успешно обновлены');
Можно создавать собственные 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');
Преимущества:
should для DOM-проверок и
expect/assert для данных API.Assertions в Cypress — это фундаментальная часть тестирования, обеспечивающая надежность проверки состояния элементов и данных. Правильное их использование делает тесты стабильными, читаемыми и поддерживаемыми.