В чем разница между техниками тест-дизайна «Разбиение на классы эквивалентности» и «Анализ граничных значений»?

Ответ

Обе техники используются для сокращения числа тестовых случаев при сохранении покрытия, но фокусируются на разных принципах.

1. Разбиение на классы эквивалентности (Equivalence Partitioning - EP)

  • Цель: Сгруппировать все возможные входные данные в классы, где поведение системы ожидается идентичным.
  • Принцип: Если одно значение из класса проходит тест, то, предположительно, пройдут и все остальные значения этого класса.
  • Пример: Поле «Возраст пользователя» принимает значения от 18 до 99 лет включительно.
    • Валидный класс эквивалентности: [18, 99] (любой возраст внутри диапазона).
    • Невалидные классы эквивалентности: (-∞, 17] (слишком молод) и [100, +∞) (слишком стар).

2. Анализ граничных значений (Boundary Value Analysis - BVA)

  • Цель: Тестирование на границах между классами эквивалентности, где вероятность ошибки наиболее высока.
  • Принцип: Для диапазона [min, max] тестируются значения: min-1, min, min+1, max-1, max, max+1.
  • Пример: Для того же поля «Возраст» (18-99):
    • Граничные значения: 17, 18, 19, 98, 99, 100.

Сравнение на практике:

# Функция для проверки возраста
def validate_age(age: int) -> bool:
    """Возвращает True, если возраст от 18 до 99 лет включительно."""
    return 18 <= age <= 99

# Тест-кейсы, объединяющие обе техники:
# 1. Класс эквивалентности: Валидный (любое значение внутри) -> берем 1 представитель.
test_cases = [
    (25, True),   # EP: Представитель валидного класса
    (18, True),   # BVA: Нижняя граница (valid)
    (99, True),   # BVA: Верхняя граница (valid)
    (17, False),  # BVA: Ниже нижней границы (invalid)
    (100, False)  # BVA: Выше верхней границы (invalid)
]
# Значения 19 и 98 также являются граничными, но часто опускаются.

for age, expected in test_cases:
    result = validate_age(age)
    assert result == expected, f"Failed for age={age}. Got {result}, expected {expected}"

Итог: EP помогает определить, что тестировать (выбрать представителей классов), а BVA уточняет, какие именно значения внутри этих классов наиболее критичны (границы). Эти техники почти всегда применяются вместе.