Первые тесты на pytest: нормальные сценарии, граничные случаи и исключения
Содержание курса
Нормальные сценарии и граничные случаи
Когда синтаксис теста уже понятен, следующий вопрос важнее: какие входные данные брать для проверки.
Нормальный сценарий — это спокойный рабочий пример. Такой, который похож на реальное использование функции и не пытается сломать её специально. Для скидки это обычная цена и обычный процент:
from prices import apply_discount
def test_apply_discount_regular_percent() -> None:
assert apply_discount(2000, 10) == 1800
Такой тест отвечает на вопрос: «функция вообще делает основную работу?» Но одного нормального сценария мало. Ошибки часто живут не в середине диапазона, а на краях.
Граничный случай — это значение около перехода в другое поведение. Для чисел это часто ноль, единица, максимум, минимум. Для коллекций — пустой список и список из одного элемента. Для строк — пустая строка, строка из одного символа, строка с пробелами.
В функции скидки края видны сразу: скидка 0% должна оставить цену как есть, а скидка 100% должна обнулить цену.
from prices import apply_discount
def test_apply_discount_zero_percent_keeps_price() -> None:
assert apply_discount(2000, 0) == 2000
def test_apply_discount_full_percent_makes_price_zero() -> None:
assert apply_discount(2000, 100) == 0
Эти тесты не проверяют «ещё два случайных числа». Они фиксируют важные точки поведения. Если в коде появится ошибка вроде неправильного знака, неверного округления или лишнего условия, крайние значения часто покажут это быстрее, чем ещё один пример с 10% или 15%.
Хороший первый набор обычно состоит из одного типичного случая и нескольких краёв. Не нужно сразу покрывать все возможные числа. Достаточно выбрать значения, про которые есть отдельный смысловой вопрос: что происходит при нуле, при одном элементе, на максимуме, на пустом вводе.
