Опиши сложный тестовый кейс из опыта, связанный с интеграцией внешних систем.

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

Ответ

Сценарий: Тестирование интеграции с внешней платежной системой, поддерживающей динамическую конвертацию валют (DCC). Пользователь в интерфейсе выбирает товар за 100 USD, но его банковская карта привязана к EUR.

Архитектура:

  1. Наш сервис запрашивает у платежного шлюза актуальный курс USD/EUR.
  2. Шлюз возвращает курс (например, 0.92) и предлагает пользователю оплатить 92 EUR.
  3. Пользователь подтверждает, платеж проводится в EUR.
  4. Наш сервер получает вебхук об успешном платеже в EUR.
  5. Мы должны корректно записать в БД сумму в исходной валюте (100 USD) для отчетности.

Ключевые сложности и тесты:

1. Расхождение в округлении: Банк-эквайер и наш сервис могли использовать разные правила округления (например, банк округляет до 2 знаков после запятой для EUR, а мы хранили 4 знака для внутренних расчетов).

def test_rounding_discrepancy():
    amount_usd = 100.00
    exchange_rate = 0.92195  # Курс от шлюза
    expected_eur = 92.20     # Банк округлит до 92.20
    our_calculated_eur = round(amount_usd * exchange_rate, 2)  # 92.195 -> 92.20

    # Симуляция ответа банка
    bank_charged_eur = 92.20

    # Допустимая дельта из-за возможного округления на стороне шлюза/банка
    assert abs(our_calculated_eur - bank_charged_eur) <= 0.01

2. Устаревший курс (Race Condition): Курс обновляется раз в час. Пользователь мог инициировать платеж в 10:59, а подтвердить в 11:01, получив новый курс.

  • Тест: Проверка, что в вебхуке от платежной системы приходит идентификатор курса, который мы сверили с пользователем.

3. Возврат средств (Refund): При возврате мы должны вернуть сумму в валюте карты (EUR), а не в валюте товара (USD). При этом сумма возврата может отличаться из-за изменения курса.

def test_refund_in_card_currency():
    # Исходный платеж: 100 USD по курсу 0.92 = 92 EUR
    charged_eur = 92.00

    # Через неделю курс изменился до 0.94
    # Возврат должен быть в EUR по сумме списания, а не по новому курсу
    refund_amount_eur = 92.00  # А не 100 * 0.94 = 94 EUR

    assert refund_amount_eur == charged_eur

4. Ведение логов для аудита: Необходимо было логировать:

  • Предложенный пользователю курс и время.
  • Фактический курс, по которому прошел платеж (из вебхука).
  • Все суммы в обеих валютах.

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