Как смоделировать сервис Kafka с помощью Citrus Framework

Как смоделировать сервис 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 в ваших тестовых проектах!)


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE