Ответ
Обе техники используются для сокращения числа тестовых случаев при сохранении покрытия, но фокусируются на разных принципах.
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 уточняет, какие именно значения внутри этих классов наиболее критичны (границы). Эти техники почти всегда применяются вместе.