Ожидание берётся из требования
Представим учебную функцию расчёта доставки. По условию для целой суммы заказа от 3000 условных единиц включительно доставка равна нулю, ниже порога равна 300. Это полное правило только для рассматриваемых неотрицательных целых сумм. Реальные тарифы и дополнительные условия в задачу не входят. Входом будет сумма заказа, фактическим результатом число, возвращённое функцией, а ожидаемым результатом значение, выведенное из правила. Если ожидание получить повторным вызовом той же функции, она может дважды ошибиться одинаково. Сравнение совпадёт, но требование так и останется непроверенным. Поэтому основание ожидания должно быть независимо от проверяемого результата.
Проверка фиксирует конкретное расхождение
В стандартном модуле unittest сравнение значений можно выразить вызовом self.assertEqual(actual, expected) внутри тестового метода класса TestCase. Если значения не равны, проверка завершается неуспешно. Имена actual и expected здесь обозначают фактическое и ожидаемое значения, которые нужно подготовить в самом тесте. Простая печать обоих чисел не выполняет такое сравнение автоматически. Человек может заметить расхождение глазами, но тестовый запуск должен уметь сообщить о нём без ручного просмотра. Полезное имя проверки описывает поведение, например бесплатную доставку ровно на пороге. Тогда причина неудачи понятнее, чем при названии с одним порядковым номером.
Порог проверяется с обеих сторон и на самой границе
Для выбранного правила удобно рассмотреть 2999, 3000 и 3001. Ожидаемые стоимости доставки составят 300, 0 и 0. Проверка только суммы 5000 не различит правильное условие от ошибочного, которое предоставляет бесплатную доставку лишь строго выше 3000. При этом три примера не доказывают корректность функции для любых данных. Отрицательные числа, дробные суммы и строки требуют отдельного согласованного поведения. Не следует придумывать его молча. Если требования об этих случаях отсутствуют, тестировщик фиксирует вопрос и отделяет известное правило от предположений о будущей реализации.
Попробуйте на практике
Постройте три проверки на бумаге. Устанавливать Python и писать исполняемую программу для этого упражнения не требуется.
- Запишите входы 2999, 3000 и 3001. До рассмотрения работы функции вычислите ожидаемую доставку по условию статьи.
- Представьте ошибочную функцию, которая возвращает ноль только для сумм строго больше 3000, а иначе возвращает 300. Определите её результат для каждого входа.
- Сравните фактические и ожидаемые значения. Укажите, какая проверка обнаружит ошибку и почему другие две её не выявляют.
- Сформулируйте смысл соответствующего сравнения assertEqual словами и запишите один случай, поведение для которого ещё нужно уточнить в требованиях.
Как проверить результат. Расхождение возникает при 3000: ожидался ноль, получено 300. При 2999 и 3001 ошибочная функция совпадает с правилом. Проверка границы обнаруживает различие между включением порога и строгим превышением. Ожидаемые результаты были определены независимо от функции.
Частые вопросы
Может ли успешный тест гарантировать отсутствие ошибок?
Нет. Он подтверждает совпадение с ожиданием в проверенных условиях. Непроверенные входы и неверно сформулированные требования остаются возможными источниками проблем.
Нужно ли сравнивать весь результат, если важна только одна его часть?
Зависит от проверяемого требования. Сравнение должно охватывать нужное поведение и давать понятное объяснение расхождения, не добавляя случайных зависимостей от несущественных деталей.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.