Негативные тесты

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

Что такое негативное тестирование?

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

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

Зачем нужны негативные тесты?

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

Возможные аспекты, которые проверяются с помощью негативного тестирования:

  • Обработка пустых значений и null.
  • Проверка на правильность работы с некорректными типами данных.
  • Реакция на недостающие параметры.
  • Поведение при несанкционированном доступе или ошибках аутентификации.
  • Отказ системы при неправильных входных данных.

Пример написания негативных тестов в Mocha

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

Пример:

const assert = require('assert');
const calculator = require('./calculator');

describe('Calculator Negative Tests', function() {
  it('should throw an error when dividing by zero', function() {
    assert.throws(() => {
      calculator.divide(10, 0);
    }, Error);
  });

  it('should return NaN for invalid input', function() {
    const result = calculator.add('a', 5);
    assert(isNaN(result), 'Expected NaN');
  });

  it('should throw an error when arguments are missing', function() {
    assert.throws(() => {
      calculator.subtract(10);
    }, Error);
  });
});

В этом примере:

  • Проверяется, что функция деления выбрасывает ошибку при попытке делить на ноль.
  • Тестирует, что функция сложения возвращает NaN, если один из аргументов не является числом.
  • Проверяется отсутствие обязательного второго аргумента в функции вычитания.

Использование асинхронных негативных тестов

В случае асинхронных операций, например, работы с базой данных или запросов к серверу, негативное тестирование также имеет большое значение. С помощью Mocha можно проверять, как система реагирует на ошибки в асинхронных функциях.

Пример асинхронного теста:

const assert = require('assert');
const fetchData = require('./fetchData');

describe('Async Negative Tests', function() {
  it('should throw an error when the server is unreachable', async function() {
    try {
      await fetchData('http://nonexistenturl.com');
    } catch (error) {
      assert.strictEqual(error.message, 'Network Error');
    }
  });

  it('should return a 404 error when the resource does not exist', async function() {
    const response = await fetchData('http://example.com/invalid-endpoint');
    assert.strictEqual(response.status, 404);
  });
});

Здесь мы проверяем:

  • Обработку ошибки сети, если сервер недоступен.
  • Ответ с ошибкой 404, если запрашиваемый ресурс не найден.

Особенности негативных тестов

  • Покрытие ошибок и исключений. Негативные тесты должны обеспечивать покрытие самых распространенных ошибок, с которыми может столкнуться система. Это включает в себя проверки на неправильный ввод данных, недоступность внешних сервисов, ошибки валидации и другие исключения.
  • Надежность. При негативном тестировании важно, чтобы приложение не “падало” при некорректных данных. Даже если тест на ошибку не проходит, приложение должно продолжать работать корректно.
  • Проверка обработки исключений. Важно, чтобы в случае ошибки приложение не просто прекращало выполнение, а корректно обрабатывало исключение. Mocha предоставляет возможности для проверки таких ситуаций с помощью методов assert.throws() и done().
  • Тестирование безопасности. Негативные тесты могут также включать проверку на уязвимости безопасности, такие как инъекции, отказ в обслуживании (DoS), неправильная обработка данных и другие сценарии, которые могут привести к проблемам с безопасностью.

Рекомендации по написанию негативных тестов

  1. Планирование ошибок. При написании негативных тестов важно четко понимать, какие именно ошибки могут возникнуть в процессе работы приложения. Для этого полезно составить список возможных исключительных ситуаций и провести анализ, как они могут быть обработаны.
  2. Покрытие разных типов ошибок. Следует тестировать как программные ошибки (например, деление на ноль), так и ошибки, связанные с вводом данных, а также внешние ошибки (например, ошибки сети или базы данных).
  3. Своевременная обработка ошибок. Каждый негативный тест должен быть направлен на то, чтобы убедиться в том, что система не только выбрасывает ошибку, но и делает это правильно, предоставляя полезную информацию о проблеме.
  4. Реализация с учетом пользовательского опыта. Тесты должны также учитывать, как ошибки могут повлиять на взаимодействие с пользователем. Например, в случае ошибки форма не должна просто “падать”, она должна сообщать пользователю о некорректных данных и позволять исправить ошибку.

Заключение

Негативные тесты — неотъемлемая часть процесса тестирования, позволяющая обеспечить надежность и устойчивость приложения. Использование Mocha для создания и выполнения таких тестов позволяет эффективно выявлять и устранять проблемы, которые могут возникнуть при обработке ошибок, неправильных данных или исключений.