Что такое классы эквивалентности? Приведите пример для функции расчета скидки.

«Что такое классы эквивалентности? Приведите пример для функции расчета скидки.» — вопрос из категории Техники тест-дизайна, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классы эквивалентности (Equivalence Partitioning) — это техника тест-дизайна, при которой все возможные входные данные разбиваются на группы (классы), элементы которых должны обрабатываться программой одинаково. Тестирование проводится одним представителем из каждого класса.

Пример: Функция расчета скидки на основе суммы покупки.

Требование:

  • Сумма < 1000: скидка 0%.
  • 1000 ≤ Сумма < 5000: скидка 5%.
  • Сумма ≥ 5000: скидка 10%.
  • Отрицательная сумма: ошибка.

Разделение на классы эквивалентности:

Класс Диапазон/Тип Ожидаемая обработка Представитель
E1 Сумма < 1000 (валидный) Скидка 0% 500
E2 1000 ≤ Сумма < 5000 (валидный) Скидка 5% 2500
E3 Сумма ≥ 5000 (валидный) Скидка 10% 7000
E4 Сумма < 0 (невалидный) Ошибка/Исключение -100
E5 Нечисловой ввод, например, строка (невалидный) Ошибка/Исключение "abc"

Пример кода на Python для тестирования:

def calculate_discount(amount):
    if not isinstance(amount, (int, float)):
        raise ValueError("Сумма должна быть числом")
    if amount < 0:
        raise ValueError("Сумма не может быть отрицательной")
    if amount < 1000:
        return amount
    elif amount < 5000:
        return amount * 0.95
    else:
        return amount * 0.90

# Тесты на основе классов эквивалентности
def test_equivalence_partitioning():
    # E1
    assert calculate_discount(500) == 500
    # E2
    assert calculate_discount(2500) == 2375.0  # 2500 * 0.95
    # E3
    assert calculate_discount(7000) == 6300.0  # 7000 * 0.90
    # E4
    try:
        calculate_discount(-100)
        assert False, "Ожидалось исключение для отрицательной суммы"
    except ValueError as e:
        assert str(e) == "Сумма не может быть отрицательной"
    # E5
    try:
        calculate_discount("abc")
        assert False, "Ожидалось исключение для нечислового ввода"
    except ValueError as e:
        assert str(e) == "Сумма должна быть числом"

Преимущество метода: Позволяет значительно сократить количество тестов, сохраняя при этом высокое покрытие.