Техники: классы эквивалентности и граничные значения
Как из бесконечного числа входов выбрать горстку, которая ловит большинство багов.
Классы эквивалентности группируют входные данные так, что система обрабатывает их одинаково; граничные значения проверяют входы на краях этих групп, где живёт большинство ошибок.
Проблема: всё проверить нельзя
Поле «возраст» принимает числа от 0 до 150. Проверять все 151 значение — расточительство. Техники тест-дизайна позволяют покрыть проблему горсткой умно выбранных входов.
Классы эквивалентности
Разобьём входы на группы, внутри которых поведение одинаково. Для правила «доступ с 18 до 65 лет»:
- Слишком молодой: 0–17 (отказ)
- Допустимый: 18–65 (доступ)
- Слишком старый: 66+ (отказ)
- Невалидный: отрицательное число (ошибка)
Достаточно по одному представителю из каждой группы — например, 10, 30, 80, −5. Если работает на представителе, скорее всего работает на всей группе.
Граничные значения
Ошибки чаще всего прячутся на краях: перепутали < и <=, ошиблись на единицу. Поэтому отдельно проверяем границы: 17/18 (нижняя) и 65/66 (верхняя).
def has_access(age):
"""Доступ разрешён с 18 до 65 лет включительно."""
return 18 <= age <= 65
# Классы эквивалентности: по представителю из группы
assert has_access(10) is False # слишком молодой
assert has_access(30) is True # допустимый
assert has_access(80) is False # слишком старый
# Граничные значения: проверяем края диапазона
assert has_access(17) is False # на 1 меньше нижней
assert has_access(18) is True # ровно нижняя
assert has_access(65) is True # ровно верхняя
assert has_access(66) is False # на 1 больше верхней
print("Все классы и границы проверены — багов на краях нет")
Вывод:
Все классы и границы проверены — багов на краях нет
Если бы автор написал 18 < age вместо 18 <= age, тест на границе has_access(18) немедленно бы упал — а тест с «серединным» 30 ничего бы не заметил. В этом и сила граничных значений.
Итог
- Классы эквивалентности: один представитель на группу одинакового поведения.
- Граничные значения: проверяем края, где живут ошибки на единицу.
- Эти две техники вместе дают высокую эффективность при минимуме тестов.