Техники: классы эквивалентности и граничные значения

Как из бесконечного числа входов выбрать горстку, которая ловит большинство багов.

Классы эквивалентности группируют входные данные так, что система обрабатывает их одинаково; граничные значения проверяют входы на краях этих групп, где живёт большинство ошибок.

Проблема: всё проверить нельзя

Поле «возраст» принимает числа от 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 ничего бы не заметил. В этом и сила граничных значений.

Итог

  • Классы эквивалентности: один представитель на группу одинакового поведения.
  • Граничные значения: проверяем края, где живут ошибки на единицу.
  • Эти две техники вместе дают высокую эффективность при минимуме тестов.
Проверьте себя
1. Что дают классы эквивалентности?
AПроверку всех возможных входов подряд
BГруппировку входов так, что достаточно одного представителя на группу
CЗамер скорости
DПроверку только границ
2. Почему важны граничные значения?
AГраницы красивее смотрятся
BБольшинство ошибок (например, путаница < и <=) живёт именно на краях диапазона
CГраницы быстрее проверять
DЭто требование закона
3. Для правила «доступ с 18 до 65» какие значения граничные?
A30 и 50
B17, 18, 65, 66
C0 и 150
D100 и 200
Поддержать проект