Ответ
С точки зрения тестирования интеграций, ключевое отличие — в модели взаимодействия и гарантиях доставки, что требует разных подходов к тест-дизайну.
| Аспект | REST API (Синхронное) | Message Broker (Асинхронное, напр., RabbitMQ, Kafka) |
|---|---|---|
| Стиль тестирования | Прямые вызовы, проверка немедленного ответа. | Отправка сообщения в очередь/топик и проверка его конечной обработки. |
| Основные проверки | Коды HTTP-ответа, тело ответа, заголовки, время отклика. | Факт доставки сообщения в брокер, порядок/дублирование сообщений, конечное состояние системы-получателя. |
| Сложность | Проще, т.к. есть прямой запрос-ответ. Можно использовать Postman, REST-assured. | Сложнее. Требуется подписываться на очередь, чтобы проверить получение, или проверять состояние БД/сервиса-получателя после обработки. Нужны таймауты для ожидания. |
| Типичные тест-кейсы | Валидация входных данных, авторизация, корректность бизнес-логики. | Устойчивость к падению потребителя (сообщения не теряются), обработка poison messages (битых сообщений), идемпотентность обработки. |
Пример сценария тестирования для Message Broker (Kafka):
// 1. Отправка тестового сообщения в топик
String testOrderId = "order-test-123";
String message = "{"orderId": "" + testOrderId + "", "status": "CREATED"}";
kafkaProducer.send(new ProducerRecord<>("orders", testOrderId, message));
// 2. Ожидание и проверка, что сервис-потребитель обработал сообщение.
// Это может быть проверка по REST API этого сервиса или запрос в его БД.
await().atMost(10, SECONDS).until(() -> {
String status = getOrderStatusViaRestApi(testOrderId); // Вспомогательный метод
return "PROCESSED".equals(status);
});
// 3. Дополнительные проверки (например, идемпотентность):
// Повторная отправка того же сообщения не должна создавать дубликат заказа в системе.
kafkaProducer.send(new ProducerRecord<>("orders", testOrderId, message));
Thread.sleep(2000);
int orderCount = getOrderCountFromDb(testOrderId); // Должен быть = 1
assertThat(orderCount).isEqualTo(1);
Тестирование брокеров сообщений фокусируется на надежности, устойчивости и согласованности данных в распределенной системе, а не только на корректности единичного запроса.