Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое классы эквивалентности?
Классы эквивалентности — это фундаментальная техника тест-дизайна, используемая в QA для разбиения всего множества возможных входных данных программы на непересекающиеся группы (классы), внутри которых поведение системы предполагается одинаковым или эквивалентным с точки зрения тестирования. Основная цель — сократить количество тестовых случаев до необходимого минимума, сохраняя при этом полноту покрытия.
Основные принципы и концепции
- Эквивалентность по поведению: Данные внутри одного класса должны обрабатываться системой идентично: либо все валидные данные приводят к корректному результату, либо все невалидные — к предсказуемой ошибке.
- Представитель класса: Для тестирования достаточно выбрать по одному (реже — нескольким) значению из каждого класса. Результат теста для этого представителя будет справедлив для всего класса.
- Разбиение на классы (Partitioning): Процесс разделения входного домена на эти самые классы. Часто говорят о «разбиении на классы эквивалентности» (Equivalence Partitioning, EP).
Типы классов эквивалентности
Обычно выделяют три основных типа:
- Валидные классы эквивалентности: Данные, которые соответствуют спецификации и ожидаемым системой. Тест с таким значением проверяет, что система выполняет свою основную функцию.
* *Пример:* Для поля «Возраст пользователя» (допустимый диапазон: 18-100) валидным классом будет `[18, 100]`.
- Невалидные классы эквивалентности: Данные, которые не соответствуют спецификации. Система должна их отклонять с понятным сообщением об ошибке, не падая.
* *Пример:* Для того же поля «Возраст» невалидных классов будет два: `меньше 18` (например, 5) и `больше 100` (например, 150).
- Граничные значения (Boundary Value Analysis — BVA): Это не отдельный класс, а мощное дополнение к EP. Опыт показывает, что ошибки часто возникают на границах классов эквивалентности. Поэтому тестируются не только произвольные представители, но и значения на самих границах и рядом с ними.
* *Пример:* Для валидного класса `[18, 100]` по методике BVA мы протестируем значения: 17 (невалидная граница), 18, 19 (валидная граница), 99, 100, 101 (невалидная граница).
Практический пример и код
Рассмотрим функцию, которая рассчитывает скидку в зависимости от суммы покупки:
- Скидка 5% при сумме от 1000 до 5000 руб.
- Скидка 10% при сумме от 5001 руб.
def calculate_discount(purchase_amount: int) -> float:
"""
Рассчитывает скидку.
"""
if purchase_amount < 0:
raise ValueError("Сумма покупки не может быть отрицательной")
elif purchase_amount < 1000:
discount = 0
elif purchase_amount <= 5000:
discount = 0.05
else:
discount = 0.10
return purchase_amount * discount
Применяем технику классов эквивалентности и граничных значений:
| Класс эквивалентности | Граничные и тестовые значения | Ожидаемый результат (скидка) | Тип класса |
|---|---|---|---|
| Отрицательные числа | -1, -100 | Исключение ValueError | Невалидный |
| 0 — 999 (нет скидки) | 0, 1, 999, 1000? | 0% (скидка = 0) | Валидный |
| 1000 — 5000 (скидка 5%) | 999, 1000, 1001, 5000, 5001 | 5% | Валидный |
| 5001 и более (скидка 10%) | 5000, 5001, 5002, 100000 | 10% | Валидный |
Важное замечание: 1000 и 5000 — это граничные значения, и их включение в тот или иной класс зависит от требований («от 1000» обычно включает 1000, «до 5000» часто включает 5000). Тестирование этих значений обязательно.
Преимущества использования
- Сокращение тестовых сценариев: Вместо перебора тысяч значений тестируются ключевые представители.
- Системный подход: Позволяет избежать хаотичного тестирования и обеспечивает полноту покрытия входного домена.
- Выявление специфических дефектов: Особенно эффективно в связке с анализом граничных значений.
- Универсальность: Метод применим не только к входным данным, но и к выходным значениям, состояниям системы, временным интервалам и т.д.
Ограничения
- Метод предполагает, что поведение внутри класса действительно одинаково. Если в реализации есть скрытые условия, дефект может быть пропущен.
- Не заменяет другие техники, такие как тестирование состояний, комбинаторные методы или тестирование случайными данными (Fuzzing). Это базовая, но критически важная техника, которая является одним из краеугольных камней профессионального тест-дизайна и применяется каждым QA-инженером, как в ручном, так и в автоматизированном тестировании. В автотестах создание параметризованных тестов, которые прогоняют данные из разных классов, — это прямая реализация данного подхода.