Негативные проверки

Негативные проверки (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 позволяет моделировать реальные сетевые условия.


Использование Cypress Assertions для негативных проверок

Для негативных сценариев часто применяются следующие утверждения:

  • 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 позволяют создавать надёжные тесты, которые гарантируют устойчивость приложения к ошибкам пользователя, неправильным данным и непредвиденным условиям работы системы. Правильное сочетание проверки форм, блокировки элементов, перехвата запросов и параметризованных тестов обеспечивает комплексное покрытие негативных сценариев.