Ответ
Контрактное тестирование (Contract Testing) — это методология тестирования на уровне интеграции, которая проверяет, что взаимодействие между двумя системами (например, клиентом и сервером, потребителем и поставщиком) соответствует совместно определённому «контракту». Цель — выявить breaking changes в API до развёртывания, особенно в микросервисной архитектуре.
Ключевые концепции:
- Потребитель (Consumer): Сервис, который вызывает API другого сервиса.
- Поставщик (Provider): Сервис, который предоставляет API.
- Контракт (Contract): Машиночитаемая спецификация ожидаемых запросов и ответов (формат, заголовки, статус-коды, схема тела).
Как это работает (на примере Pact):
- Потребитель определяет ожидания: В своих тестах потребитель описывает, какие запросы он будет отправлять и какие ответы ожидать.
// Пример контракта в Pact (JavaScript) await provider.addInteraction({ state: 'a product with ID 10 exists', uponReceiving: 'a request to get product by ID', withRequest: { method: 'GET', path: '/products/10' }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: { id: 10, name: 'Laptop', price: 999.99 } } }); // Тест потребителя выполняется против mock-сервера Pact - Генерация и публикация контракта: Pact генерирует файл контракта (JSON) и публикует его в брокере.
- Провайдер проверяет контракт: Поставщик загружает контракт и проверяет, что его реальный API удовлетворяет всем ожиданиям потребителя.
Преимущества:
- Раннее обнаружение проблем: Несовместимости обнаруживаются на этапе CI/CD, а не в production.
- Независимость команд: Команды потребителя и поставщика могут работать независимо, сверяясь с контрактом.
- Быстрые и надёжные тесты: Заменяют хрупкие интеграционные тесты, зависящие от развёрнутых сред.