Ответ
Негативное тестирование — это проверка поведения системы при невалидных входных данных, нештатных условиях или ошибочных действиях пользователя. Его цель — убедиться, что система устойчива к сбоям и корректно обрабатывает ошибки.
Ожидаемое поведение системы в негативных сценариях:
- Отказоустойчивость: Система не должна полностью падать, допускать утечки памяти или данных.
- Защита данных: Критические данные не должны быть повреждены или потеряны.
- Корректная обработка ошибок: Возвращается понятный и безопасный для пользователя ответ (сообщение об ошибке, код состояния HTTP).
- Восстановление состояния: После ошибки система возвращается в стабильное, предсказуемое состояние.
- Логирование: Информация об ошибке (стектрейс, контекст) должна записываться в логи для последующего анализа разработчиками.
Пример теста на 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+ 🔞
А, слушай, вот это тема — негативное тестирование! Это ж когда ты, как самый ебучий пользователь на планете, пытаешься систему сломать. Не по сценарию, а наоборот — делаешь всё, чтобы она, блядь, накрылась медным тазом. Суть в том, чтобы запихнуть ей в рот не то, что она ждёт, а какую-нибудь дичь, и посмотреть, не обосрётся ли она.
Что мы хотим от системы, когда мы её так изнасиловали?
- Не умирать нахуй. Чтобы она не легла пластом, не выплюнула все данные в /dev/null и не начала есть всю оперативку, как мартышлюшка бананы.
- Не терять святое. Критические данные — пароли, заказы, фотки котиков — должны остаться в целости и сохранности. Не должно быть такого, что из-за введённой буквы 'ё' в поле «количество» вся база превращается в кашу.
- Красиво послать. Ошибка должна быть, но человеческая. Не «Segmentation fault (core dumped)», а что-то вроде «Э, дружок-пирожок, возраст-то у тебя отрицательный, ты кто, путешественник во времени?». И статус HTTP 400, а не 500 с полным пиздецом внутри.
- Прийти в себя. После того как ты её впендюрил невалидными данными, она должна отряхнуться и быть готовой к следующему запросу. Не висеть в каком-то промежуточном, ебучем состоянии.
- Настучать. А нам, разработчикам, она должна оставить подробную записку в логах: «Так, бля, тут такой-то чувак в 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}'"
Вот это и есть искусство — не проверить, как всё работает, когда всё хорошо. А узнать, как система себя ведёт, когда всё пошло по пизде. Чтобы потом пользователь не охуел от того, что из-за одной запятой не в том месте весь его заказ на овердохуища денег просто испарился в никуда.