← Назад к вопросам

Что такое классы эквивалентности?

1.0 Junior🔥 151 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое классы эквивалентности?

Классы эквивалентности — это фундаментальная техника тест-дизайна, используемая в QA для разбиения всего множества возможных входных данных программы на непересекающиеся группы (классы), внутри которых поведение системы предполагается одинаковым или эквивалентным с точки зрения тестирования. Основная цель — сократить количество тестовых случаев до необходимого минимума, сохраняя при этом полноту покрытия.

Основные принципы и концепции

  • Эквивалентность по поведению: Данные внутри одного класса должны обрабатываться системой идентично: либо все валидные данные приводят к корректному результату, либо все невалидные — к предсказуемой ошибке.
  • Представитель класса: Для тестирования достаточно выбрать по одному (реже — нескольким) значению из каждого класса. Результат теста для этого представителя будет справедлив для всего класса.
  • Разбиение на классы (Partitioning): Процесс разделения входного домена на эти самые классы. Часто говорят о «разбиении на классы эквивалентности» (Equivalence Partitioning, EP).

Типы классов эквивалентности

Обычно выделяют три основных типа:

  1. Валидные классы эквивалентности: Данные, которые соответствуют спецификации и ожидаемым системой. Тест с таким значением проверяет, что система выполняет свою основную функцию.
    *   *Пример:* Для поля «Возраст пользователя» (допустимый диапазон: 18-100) валидным классом будет `[18, 100]`.

  1. Невалидные классы эквивалентности: Данные, которые не соответствуют спецификации. Система должна их отклонять с понятным сообщением об ошибке, не падая.
    *   *Пример:* Для того же поля «Возраст» невалидных классов будет два: `меньше 18` (например, 5) и `больше 100` (например, 150).

  1. Граничные значения (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, 50015%Валидный
5001 и более (скидка 10%)5000, 5001, 5002, 10000010%Валидный

Важное замечание: 1000 и 5000 — это граничные значения, и их включение в тот или иной класс зависит от требований («от 1000» обычно включает 1000, «до 5000» часто включает 5000). Тестирование этих значений обязательно.

Преимущества использования

  • Сокращение тестовых сценариев: Вместо перебора тысяч значений тестируются ключевые представители.
  • Системный подход: Позволяет избежать хаотичного тестирования и обеспечивает полноту покрытия входного домена.
  • Выявление специфических дефектов: Особенно эффективно в связке с анализом граничных значений.
  • Универсальность: Метод применим не только к входным данным, но и к выходным значениям, состояниям системы, временным интервалам и т.д.

Ограничения

  • Метод предполагает, что поведение внутри класса действительно одинаково. Если в реализации есть скрытые условия, дефект может быть пропущен.
  • Не заменяет другие техники, такие как тестирование состояний, комбинаторные методы или тестирование случайными данными (Fuzzing). Это базовая, но критически важная техника, которая является одним из краеугольных камней профессионального тест-дизайна и применяется каждым QA-инженером, как в ручном, так и в автоматизированном тестировании. В автотестах создание параметризованных тестов, которые прогоняют данные из разных классов, — это прямая реализация данного подхода.
Что такое классы эквивалентности? | PrepBro