Цель тестирования: находить дефекты и давать уверенность
Разбираемся, ради чего вообще пишут тесты и почему «у меня всё работает» — не аргумент.
Тестирование — это процесс проверки того, что программа делает то, что должна, и не делает того, чего не должна; его цель — найти дефекты как можно раньше и дать команде уверенность в изменениях.
Две настоящие цели
Начинающие думают, что цель тестирования — «доказать, что программа работает». На самом деле целей две, и обе важнее этого наивного представления.
- Находить дефекты. Хороший тест — это тот, который ломается, обнаружив ошибку. Тест, который всегда зелёный, не приносит информации. Тестировщик мыслит как скептик: «где здесь может сломаться?»
- Давать уверенность. Набор тестов — это страховочная сетка. Он позволяет менять код смело: если что-то сломалось, тесты загорятся красным до того, как это увидит пользователь.
Тестирование не доказывает отсутствие багов
Знаменитая мысль Дейкстры: тестирование может показать наличие дефектов, но никогда — их полное отсутствие. Проверить все возможные входы реальной программы невозможно. Поэтому тестирование — это управление риском, а не гарантия совершенства. Мы выбираем самые важные и самые опасные сценарии и проверяем именно их.
Простейший тест — это проверка ожидания
В основе любого теста лежит сравнение «что получилось» с «что ожидалось». В Python это удобно выразить через assert: если условие ложно, программа падает с ошибкой.
def discount_price(price, percent):
"""Цена со скидкой в процентах."""
return price - price * percent / 100
# Тест: проверяем ожидаемое поведение
def test_discount_price():
assert discount_price(100, 10) == 90 # обычная скидка
assert discount_price(100, 0) == 100 # без скидки
assert discount_price(200, 50) == 100 # половина
test_discount_price()
print("Тест пройден: discount_price считает скидку верно")
Вывод:
Тест пройден: discount_price считает скидку верно
Если бы в функции была ошибка (например, + вместо -), assert упал бы — и тест честно сообщил бы о дефекте. Именно этого мы и хотим от теста.
Кто тестирует
Тестирование — не работа «отдельных людей в конце». Разработчик пишет модульные тесты на свой код, QA-инженер проектирует сценарии и проверяет систему целиком, а автотесты в CI прогоняются на каждое изменение. Качество — командная ответственность.
Итог
- Цель тестирования — находить дефекты рано и давать уверенность в изменениях.
- Тестирование показывает наличие багов, но не доказывает их отсутствие.
- Любой тест — это сравнение «получилось» с «ожидалось».