Что такое негативное тестирование и какое поведение системы в нем ожидается?

Ответ

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

Ожидаемое поведение системы в негативных сценариях:

  1. Отказоустойчивость: Система не должна полностью падать, допускать утечки памяти или данных.
  2. Защита данных: Критические данные не должны быть повреждены или потеряны.
  3. Корректная обработка ошибок: Возвращается понятный и безопасный для пользователя ответ (сообщение об ошибке, код состояния HTTP).
  4. Восстановление состояния: После ошибки система возвращается в стабильное, предсказуемое состояние.
  5. Логирование: Информация об ошибке (стектрейс, контекст) должна записываться в логи для последующего анализа разработчиками.

Пример теста на Python для проверки валидации возраста:

import pytest

def test_negative_age_input():
    """Проверяем, что система отвергает отрицательный возраст с понятной ошибкой."""
    invalid_age = -5

    # Попытка выполнить операцию с невалидными данными
    with pytest.raises(ValidationError) as exc_info:
        process_user_age(invalid_age)

    # Проверяем текст ошибки
    expected_error_msg = "Возраст должен быть положительным числом."
    assert str(exc_info.value) == expected_error_msg, 
        f"Ожидалось: '{expected_error_msg}', Получено: '{exc_info.value}'"

Ответ 18+ 🔞

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

Что мы хотим от системы, когда мы её так изнасиловали?

  1. Не умирать нахуй. Чтобы она не легла пластом, не выплюнула все данные в /dev/null и не начала есть всю оперативку, как мартышлюшка бананы.
  2. Не терять святое. Критические данные — пароли, заказы, фотки котиков — должны остаться в целости и сохранности. Не должно быть такого, что из-за введённой буквы 'ё' в поле «количество» вся база превращается в кашу.
  3. Красиво послать. Ошибка должна быть, но человеческая. Не «Segmentation fault (core dumped)», а что-то вроде «Э, дружок-пирожок, возраст-то у тебя отрицательный, ты кто, путешественник во времени?». И статус HTTP 400, а не 500 с полным пиздецом внутри.
  4. Прийти в себя. После того как ты её впендюрил невалидными данными, она должна отряхнуться и быть готовой к следующему запросу. Не висеть в каком-то промежуточном, ебучем состоянии.
  5. Настучать. А нам, разработчикам, она должна оставить подробную записку в логах: «Так, бля, тут такой-то чувак в 14:32 попытался засунуть строку "абвгд" в поле «сумма перевода». Вот стектрейс, где всё пошло по пизде, разбирайтесь». Без этого — терпения ноль ебать, искать причину.

Вот, смотри, как это выглядит в коде. Просто представь, что ты пытаешься зарегистрировать вампира или новорождённого старика:

import pytest

def test_negative_age_input():
    """А давайте попробуем запихнуть в систему возраст минус пять лет. Что, интересно, будет?"""
    invalid_age = -5  # Чувак из будущего, или просто мудак?

    # Сейчас мы ожидаем, что система нам даст по рукам и выкинет ошибку
    with pytest.raises(ValidationError) as exc_info:
        process_user_age(invalid_age)  # Пытаемся скормить ей эту хуйню

    # А теперь проверяем, ЧТО ИМЕННО она нам сказала. Не «Ошибка», а конкретно «Иди нахуй с таким возрастом»
    expected_error_msg = "Возраст должен быть положительным числом."
    assert str(exc_info.value) == expected_error_msg, 
        f"Ожидалось вежливое: '{expected_error_msg}', а система проорала: '{exc_info.value}'"

Вот это и есть искусство — не проверить, как всё работает, когда всё хорошо. А узнать, как система себя ведёт, когда всё пошло по пизде. Чтобы потом пользователь не охуел от того, что из-за одной запятой не в том месте весь его заказ на овердохуища денег просто испарился в никуда.