Как протестировать функционал применения скидок в интернет-магазине?

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

Ответ

Тестирование системы скидок требует проверки бизнес-логики, расчетов и интеграций.

1. Позитивные тест-кейсы (валидные сценарии):

  • Процентная скидка: Товар за 1000 руб. со скидкой 10% = 900 руб.
  • Фиксированная скидка: Товар за 1000 руб. со скидкой 200 руб. = 800 руб.
  • Скидка от суммы корзины: Корзина на 5000 руб., скидка 5% от суммы > 3000 руб. = 4750 руб.
  • Накопительная скидка: Скидка 7% для статуса "Gold" клиента.
  • Комбинирование: Применение только одной максимальной скидки из нескольких доступных.

2. Негативные тест-кейсы и проверка граничных значений:

  • Невыполнение условий: Попытка применить промокод при сумме корзины 900 руб., когда минимум — 1000 руб.
  • Неактивные/просроченные промокоды.
  • Граничные значения: Корзина ровно на 1000 руб. при условии "от 1000 руб.".
  • Исчерпание лимита: Использование одноразового промокода дважды.

3. Проверка отображения и интеграции:

  • UI/UX: Скидка должна быть четко показана в корзине, в карточке товара и в итоговом заказе.
  • Расчеты: Итоговая сумма в заказе, стоимость доставки (если влияет), налоги должны пересчитываться корректно.
  • Бэкенд и аналитика: Проверка, что информация о примененной скидке корректно сохраняется в заказе и передается в системы отчетности.

4. Пример модульного теста для логики расчета:

import pytest

def test_percentage_discount():
    cart = Cart(total=2000)
    discount = Discount(type="percentage", value=10, min_cart_total=1000)

    final_price = discount.apply_to(cart)

    # Ожидаем: 2000 - (2000 * 0.1) = 1800
    assert final_price == 1800

def test_discount_not_applied():
    cart = Cart(total=900)  # Меньше минимальной суммы
    discount = Discount(type="percentage", value=10, min_cart_total=1000)

    final_price = discount.apply_to(cart)

    # Скидка не должна примениться
    assert final_price == 900