Ответ
Задача: Протестировать интеграцию с внешней платежной системой, где тестовое окружение банка не позволяло симулировать редкие, но важные сценарии (например, отказ банка в платеже, таймаут соединения).
Решение и действия:
- Анализ ограничений и рисков: Определил, что прямые тесты невозможны для сценариев:
payment_rejected_by_bank,payment_timeout,partial_refund. - Выбор стратегии — Mocking: Решил замокать ответы внешнего API на уровне нашего сервиса.
- Использовал WireMock (для Java) для создания гибкого mock-сервера.
- Определил контракты (OpenAPI/Swagger) ответов банка для всех возможных статусов.
- Реализация:
- Настроил WireMock на возвращение различных ответов (
200 OK,400 Bad Request,504 Gateway Timeout) в зависимости от параметров запроса. - Написал интеграционные тесты, которые проверяли реакцию нашей системы на каждый из этих ответов.
- Настроил WireMock на возвращение различных ответов (
Пример кода (упрощенно):
// Настройка мока для сценария "банк отклоняет платеж"
stubFor(post(urlPathEqualTo("/api/bank/pay"))
.withRequestBody(matchingJsonPath("$.amount", equalTo("999.99"))) // Специфичная сумма для триггера отказа
.willReturn(aResponse()
.withStatus(400)
.withHeader("Content-Type", "application/json")
.withBody("{ "code": "INSUFFICIENT_FUNDS" }")));
// Интеграционный тест
@Test
public void testPaymentRejectedByBank() {
PaymentRequest request = new PaymentRequest("999.99", "USD");
PaymentResponse response = paymentService.process(request);
assertThat(response.getStatus()).isEqualTo(PaymentStatus.FAILED);
assertThat(response.getErrorCode()).isEqualTo("BANK_REJECTED");
}
- Для edge-кейсов (например, обрыв сети) согласовал с командой и описал ручные проверки в чек-листе для релиза.
Итог: Покрытие интеграционных сценариев выросло с ~70% до 95%. Команда получила надежный автоматизированный слой тестов, не зависящий от капризов внешнего тестового окружения банка.