Ответ
Комбинирование позитивных и негативных тестов — это основа надежного тестового покрытия. Оно проверяет систему не только в идеальных условиях, но и в условиях сбоев.
Позитивное тестирование (Positive Testing)
- Цель: Проверить, что система корректно выполняет заявленные функции при валидных входных данных и условиях.
- Фокус: «Счастливый путь» (happy path).
- Пример: Успешный логин с правильными учетными данными.
Негативное тестирование (Negative Testing)
- Цель: Проверить, что система корректно обрабатывает ошибки и не выполняет недопустимые операции при невалидных входных данных или в нештатных условиях.
- Фокус: Устойчивость, обработка исключений, защита от дурака.
- Пример: Попытка логина с неправильным паролем, пустыми полями, SQL-инъекцией в поле ввода.
Пример комбинации (тест функции деления)
def test_divide():
# Позитивный тест: нормальное выполнение
assert divide(10, 2) == 5
# Негативные тесты: проверка обработки ошибок
with pytest.raises(ZeroDivisionError):
divide(10, 0) # Деление на ноль
with pytest.raises(TypeError):
divide("10", 2) # Неверный тип аргумента
Преимущества комбинации
- Повышение надежности: Система не только работает, но и «защищена» от некорректного использования.
- Раннее обнаружение дефектов: Многие серьезные баги (утечки памяти, падения) проявляются именно при негативных сценариях.
- Проверка UX: Убеждаемся, что пользователь получает понятные сообщения об ошибках, а не сырые stack trace.
Ответ 18+ 🔞
Да ты посмотри, какая история-то, блядь! Вот сидишь ты, такой весь из себя крутой тестировщик, пишешь свои проверки на "счастливый путь", и думаешь: "Ну всё, проект — огонь, можно сдавать". А потом приходит пользователь, сука, и начинает в поля вводить не "123", а "ёпта' OR '1'='1", и вся твоя система накрывается медным тазом, блядь!
Так вот, чтобы этого не случилось, умные дядьки придумали комбинировать два подхода. Это как, понимаешь, не только проверять, что дверь открывается ключом, но и тыкать в замочную скважину спицей, ножом и хуем с винтом — вдруг откроется?
Позитивное тестирование (Positive Testing) Это когда ты ведешь систему по "счастливому пути", как девицу под ручку. Цель — убедиться, что заявленные функции вообще работают на нормальных, валидных данных.
- Фокус: "Всё хорошо, прекрасная маркиза".
- Пример: Вводишь правильный логин и пароль — попадаешь в личный кабинет. Ура, блядь, можно идти пить чай.
Негативное тестирование (Negative Testing) А вот это уже, сука, самое интересное! Цель — устроить системе полный пиздец и посмотреть, как она будет из этого пиздеца выкарабкиваться. Корректно ли ругнется, не вылетит ли с "синим экраном смерти", не отдаст ли базу данных первому встречному.
- Фокус: Устойчивость, защита от дурака (которым, как известно, является каждый пользователь, включая тебя самого в понедельник утром).
- Пример: Пытаешься залогиниться с пустым паролем, с паролем из миллиона символов, с паролем "DROP TABLE users;". Система должна тебе вежливо, но твердо сказать: "Иди нахуй, чувак, так нельзя".
Вот смотри, наглядный пример, как это в коде выглядит. Блок кода не трогаю, как велели, он и так красивый.
def test_divide():
# Позитивный тест: нормальное выполнение
assert divide(10, 2) == 5
# Негативные тесты: проверка обработки ошибок
with pytest.raises(ZeroDivisionError):
divide(10, 0) # Деление на ноль
with pytest.raises(TypeError):
divide("10", 2) # Неверный тип аргумента
Видишь? Сначала проверяем, что функция вообще делит — это позитив. А потом начинаем, блядь, издеваться: "А на ноль подели, сука! А строку на число подели!" И смотрим, не сломается ли она, а корректно выкинет нужную ошибку. Это и есть негатив.
А зачем это всё, спросишь? Да затем, ебать мои старые костыли!
- Надежность овердохуища. Система становится не просто рабочей, а живучей, как таракан. Работает в идеале и не падает в хлам при малейшем чихе.
- Баги всплывают раньше. Самые сочные, опасные косяки (памяти утекло, сервер лег) часто вылезают именно когда ты начинаешь ебашить систему не по сценарию. Лучше ты их найдешь, чем это сделает клиент в проде, а потом тебе позвонят в три часа ночи.
- UX не страдает. Ты проверяешь, что пользователь увидит внятное "Неверный пароль", а не дичь вида "Internal Server Error 500: NullPointerException at com.example.StupidService:69". Чтобы не было потом криков "Да что ж это за пиздопроебищна такая!".
Короче, если тестируешь только позитивные сценарии — ты полупидор. Настоящий мастер, блядь, всегда комбинирует. Сначала дал системе конфетку (позитив), а потом — хуй в ухо (негатив). Если после этого она всё ещё жива и адекватно отвечает — вот тогда можно и на прод выпускать, волнение ебать.