Цель тестирования: находить дефекты и давать уверенность

Разбираемся, ради чего вообще пишут тесты и почему «у меня всё работает» — не аргумент.

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

Две настоящие цели

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

  • Находить дефекты. Хороший тест — это тот, который ломается, обнаружив ошибку. Тест, который всегда зелёный, не приносит информации. Тестировщик мыслит как скептик: «где здесь может сломаться?»
  • Давать уверенность. Набор тестов — это страховочная сетка. Он позволяет менять код смело: если что-то сломалось, тесты загорятся красным до того, как это увидит пользователь.

Тестирование не доказывает отсутствие багов

Знаменитая мысль Дейкстры: тестирование может показать наличие дефектов, но никогда — их полное отсутствие. Проверить все возможные входы реальной программы невозможно. Поэтому тестирование — это управление риском, а не гарантия совершенства. Мы выбираем самые важные и самые опасные сценарии и проверяем именно их.

Простейший тест — это проверка ожидания

В основе любого теста лежит сравнение «что получилось» с «что ожидалось». В 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 прогоняются на каждое изменение. Качество — командная ответственность.

Итог

  • Цель тестирования — находить дефекты рано и давать уверенность в изменениях.
  • Тестирование показывает наличие багов, но не доказывает их отсутствие.
  • Любой тест — это сравнение «получилось» с «ожидалось».
Проверьте себя
1. Какова главная цель тестирования?
AДоказать, что в программе нет ни одного бага
BНаходить дефекты рано и давать уверенность в изменениях
CЗамедлить релиз, чтобы перестраховаться
DЗаменить работу разработчиков
2. Что означает мысль Дейкстры о тестировании?
AТесты гарантируют идеальную программу
BТестирование может показать наличие дефектов, но не их отсутствие
CТестировать нужно только вручную
DЧем больше тестов, тем медленнее код
3. Почему тест, который всегда зелёный и ничего не проверяет, плох?
AОн слишком быстрый
BОн не приносит информации и не способен обнаружить дефект
CОн занимает место в репозитории
DОн требует QA-инженера
Поддержать проект