Ответ
Контрактное тестирование — это метод проверки взаимодействия между двумя сервисами (потребителем и поставщиком) на основе формального соглашения («контракта») о формате запросов и ответов.
Цель: Гарантировать, что сервисы могут корректно взаимодействовать, даже если разрабатываются и развертываются независимо.
Как это работает:
- Потребитель (Consumer) определяет ожидаемые запросы к провайдеру и ответы от него. Это формирует «контракт».
- Провайдер (Provider) проверяет, что его реальный API соответствует всем контрактам, на которые он подписан.
Пример с использованием фреймворка Pact (JavaScript):
// ТЕСТ ПОТРЕБИТЕЛЯ (Consumer Test) - создает контракт
const { Pact } = require('@pact-foundation/pact');
const provider = new Pact({
consumer: 'UserService',
provider: 'AuthService',
});
describe('Auth Service Contract', () => {
beforeAll(() => provider.setup());
it('ожидает успешный ответ при запросе токена', async () => {
await provider.addInteraction({
state: 'пользователь существует',
uponReceiving: 'запрос на аутентификацию',
withRequest: {
method: 'POST',
path: '/api/token',
body: { login: 'test', password: 'pass' },
},
willRespondWith: {
status: 200,
body: { token: 'jwt-token-123' },
},
});
// Здесь выполняется реальный вызов клиента AuthService
// и проверяется соответствие контракту
});
afterAll(() => provider.finalize());
});
Преимущества:
- Раннее обнаружение проблем: Интеграционные ошибки выявляются на этапе CI/CD, а не в продакшене.
- Независимость команд: Команды могут разрабатывать и тестировать свои сервисы автономно.
- Надежная документация: Контракты служат актуальным источником истины об API.
- Замена интеграционных тестов: Позволяет отказаться от хрупких сквозных (E2E) тестов для проверки взаимодействия сервисов.