Как смоделировать сервис Kafka с помощью Citrus Framework
11 января 2023 г.Сегодня многие команды используют Kafka для разработки сервисов. Многие ведущие ИТ-компании уже активно и успешно используют этот инструмент. Наверняка уже есть много статей о преимуществах использования Kafka на проектах, но сейчас я хочу рассказать об этом в контексте тестирования, а точнее о том, как тестировщик может создать Kafka-mock, то есть симулятор, который можно использовать в тестах.
Немного ясности, посмотрим схему взаимодействия, где есть Кафка и тестируемая система, допустим это выглядит так:
Следовательно, если мы хотим протестировать SUT (тестируемую систему) изолированно, нам потребуются следующие заглушки:
- Кафка издевается над собой
- Насмешка продюсера
- Обман пользователя
Зная все это, приступим к подготовке тестовой среды в тестовом проекте. Я буду использовать настройки версии Citrus 3.2.1. О том, как сгенерировать шаблонный проект Citrus, я рассказывал в одной из предыдущих статей, теперь давайте сразу приступим к настройке файлов pom.xml и citrus-context.xml:
1. Добавьте зависимость в pom.xml
<dependency>
<groupId>com.consol.citrus</groupId>
<artifactId>citrus-kafka</artifactId>
<version>${citrus.version}</version>
</dependency>
2. Добавьте пространство имен и расположение схемы для Kafka в citrus-context.xml
xmlns:citrus-kafka="http://www.citrusframework.org/schema/kafka/config"
xsi:schemaLocation=
http://www.citrusframework.org/schema/kafka/config
http://www.citrusframework.org/schema/kafka/config/citrus-kafka-config.xsd
3. Создайте встроенный компонент Kafka
<citrus-kafka:embedded-server id="embeddedKafka"
kafka-server-port="9590"
topics="QUEUE_IN_NAME, QUEUE_OUT_NAME"
partitions="10"/>
4. Создайте bean-компонент Producer
<citrus-kafka:endpoint id="mqProducer"
server="localhost:9590"
topic="QUEUE_IN_NAME"/>
5. Создайте потребительский компонент
<citrus-kafka:endpoint id="mqConsumer"
server="localhost:9590"
topic="QUEUE_OUT_NAME"/>
Теперь конфигурация среды готова, и вы можете приступить к написанию теста, который будет отправлять сообщение в качестве MQ Producer, а после работы через SUT тестовый MQ Consumer получит сообщение, которое будет проверено на предмет ожидаемого результата.
Итак, тест Citrus будет выглядеть так:
package tests;
import com.consol.citrus.annotations.CitrusTest;
import com.consol.citrus.context.TestContext;
import com.consol.citrus.testng.TestNGCitrusSupport;
import org.testng.annotations.Test;
import static com.consol.citrus.actions.ReceiveMessageAction.Builder.receive;
import static com.consol.citrus.actions.SendMessageAction.Builder.send;
public class TestKafka extends TestNGCitrusSupport {
public TestContext context;
@Test(description = "Kafka test")
@CitrusTest
public void getTestActions() {
this.context = citrus.getCitrusContext().createTestContext();
run(send("mqProducer")
.message()
.body("Message content to send")
);
run(receive("mqConsumer")
.message()
.body("Expected message content"));
}
}
Инфраструктура Kafka (bean-компонент «embeddedKafka») автоматически запускается вместе с тестом. Таким образом, конечной точке производителя Citrus Kafka просто нужно подключиться к брокеру сервера Kafka. Тест отправляет сообщение в очередь, затем получает сообщение из другой очереди и проверяет результат.
Конечно, не забудьте настроить SUT для взаимодействия с вашей «встроенной Kafka».
Это все на данный момент. Желаю вам успешного применения решений Citrus framework в ваших тестовых проектах!)
Оригинал