Первое время я писал тесты «потому что надо», не чувствуя смысла, и они скорее раздражали. Потом тест поймал граничный баг — и я по-настоящему записался в фанаты только после того, как понял, что тестирую поведение, а не код ради галочки. Стало легче, когда я перестал гнаться за «покрыть 100%», а спросил: «какие сценарии нельзя сломать молча».
Нейтрально: полезные тесты покрывают важные пути и границы, а не каждую строку. Показатель покрытия — ориентир, а не цель.
def apply_discount(price, percent):
if not 0 <= percent <= 100: # граница
raise ValueError("Процент вне диапазона")
return price * (1 - percent / 100)
import pytest
def test_границы():
assert apply_discount(100, 0) == 100
assert apply_discount(100, 100) == 0
with pytest.raises(ValueError):
apply_discount(100, 150)
Удовольствие пришло именно с постановки вопроса «что не должно сломаться», а не «как угодить показателю». Проверить успех, пустое значение и границу — уже покрыл главные риски маленькой функции.