Негативные проверки (negative testing) представляют собой проверку поведения приложения при некорректных, неожиданных или неполных данных. Основная цель таких тестов — убедиться, что система корректно обрабатывает ошибки и не допускает некорректные действия пользователя. В Cypress негативное тестирование реализуется с помощью комбинации стандартных команд фреймворка и специфических стратегий проверки ошибок.
Одной из ключевых задач негативного тестирования является проверка форм. Например, форма регистрации может требовать обязательное поле «Email».
describe('Регистрация - негативные сценарии', () => {
it('должна показывать ошибку при пустом email', () => {
cy.visit('/register');
cy.get('input[name="password"]').type('ValidPass123');
cy.get('button[type="submit"]').click();
cy.get('.error-message')
.should('be.visible')
.and('contain.text', 'Email обязателен');
});
it('должна показывать ошибку при некорректном формате email', () => {
cy.get('input[name="email"]').type('invalid-email');
cy.get('button[type="submit"]').click();
cy.get('.error-message')
.should('be.visible')
.and('contain.text', 'Неверный формат email');
});
});
Ключевой момент: should('be.visible')
гарантирует, что ошибка отображается пользователю, а
contain.text проверяет корректность сообщения.
Негативное тестирование также включает проверку бизнес-правил и ограничений:
Пример проверки ограничения на длину пароля:
it('не позволяет использовать короткий пароль', () => {
cy.get('input[name="password"]').type('123');
cy.get('button[type="submit"]').click();
cy.get('.error-message')
.should('contain.text', 'Пароль должен быть не менее 8 символов');
});
Негативные тесты проверяют, что элементы интерфейса недоступны при
определённых условиях. Cypress позволяет это делать с помощью команды
should('be.disabled'):
it('кнопка отправки заблокирована без заполнения обязательных полей', () => {
cy.get('input[name="email"]').clear();
cy.get('input[name="password"]').clear();
cy.get('button[type="submit"]').should('be.disabled');
});
Вывод: такой подход предотвращает выполнение действий пользователем до выполнения обязательных условий.
Cypress позволяет имитировать ошибки серверной части для проверки
устойчивости фронтенда. Используется метод cy.intercept для
перехвата HTTP-запросов.
it('показывает сообщение об ошибке при сбое сервера', () => {
cy.intercept('POST', '/api/login', { statusCode: 500, body: { error: 'Internal Server Error' } });
cy.get('input[name="email"]').type('user@example.com');
cy.get('input[name="password"]').type('ValidPass123');
cy.get('button[type="submit"]').click();
cy.get('.error-message')
.should('contain.text', 'Произошла ошибка сервера, попробуйте позже');
});
Ключевой момент: перехват запросов позволяет тестировать обработку нештатных сценариев без реального сбоя сервера.
Негативное тестирование охватывает и навигацию: система не должна перенаправлять пользователя на защищённые страницы без авторизации.
it('не позволяет перейти на страницу профиля без авторизации', () => {
cy.visit('/profile');
cy.url().should('include', '/login');
});
Особенность: здесь проверяется URL и поведение роутера, что предотвращает несанкционированный доступ.
Cypress автоматически ждёт завершения асинхронных операций, что облегчает проверку ошибок, возникающих с задержкой:
it('показывает тайм-аут при долгом ответе сервера', () => {
cy.intercept('GET', '/api/data', { delay: 5000, statusCode: 408 });
cy.visit('/dashboard');
cy.get('.timeout-message')
.should('contain.text', 'Сервер не отвечает, попробуйте позже');
});
Здесь важно: использование delay
позволяет моделировать реальные сетевые условия.
Для негативных сценариев часто применяются следующие утверждения:
should('exist') и should('not.exist') —
проверка наличия или отсутствия элементов;should('contain.text', '...') — проверка текста
ошибок;should('be.visible') и
should('not.be.visible') — проверка отображения;should('be.disabled') — проверка блокировки
элементов.Комбинация этих методов обеспечивает комплексное покрытие негативных сценариев.
Cypress поддерживает использование массивов данных для проверки множества негативных сценариев одним тестом:
const invalidEmails = ['plainaddress', '@missinguser.com', 'user@.com'];
invalidEmails.forEach(email => {
it(`не принимает некорректный email: ${email}`, () => {
cy.get('input[name="email"]').clear().type(email);
cy.get('button[type="submit"]').click();
cy.get('.error-message')
.should('contain.text', 'Неверный формат email');
});
});
Преимущество: легко расширять наборы проверок и поддерживать тесты при изменении бизнес-логики.
Негативные проверки в Cypress позволяют создавать надёжные тесты, которые гарантируют устойчивость приложения к ошибкам пользователя, неправильным данным и непредвиденным условиям работы системы. Правильное сочетание проверки форм, блокировки элементов, перехвата запросов и параметризованных тестов обеспечивает комплексное покрытие негативных сценариев.