Today, many teams use Kafka in service development. Many leading IT companies are already actively and successfully using this tool. There are probably already many articles about the advantages of using Kafka on projects, but now I want to talk about this in the context of testing, or rather, how a tester can create Kafka-mock, that is, a simulator that can be used in tests.
A bit of clarity, let's see the interaction scheme, where there is Kafka and the system under testing, suppose it looks like this:
Hence, if we want to test SUT(system under test ) in isolation, then we need the following stubs:
Knowing all this, let's start preparing a test environment in a test project. I will be using Citrus 3.2.1 version settings. I talked about how to generate a template Citrus project in one of the previous articles, now let's immediately start configuring the pom.xml and citrus-context.xml files:
1. Add dependency to pom.xml
<dependency>
<groupId>com.consol.citrus</groupId>
<artifactId>citrus-kafka</artifactId>
<version>${citrus.version}</version>
</dependency>
2. Add namespace and schemaLocation for Kafka to 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. Create a Kafka embedded bean
<citrus-kafka:embedded-server id="embeddedKafka"
kafka-server-port="9590"
topics="QUEUE_IN_NAME, QUEUE_OUT_NAME"
partitions="10"/>
4. Create a Producer bean
<citrus-kafka:endpoint id="mqProducer"
server="localhost:9590"
topic="QUEUE_IN_NAME"/>
5. Create a Consumer bean
<citrus-kafka:endpoint id="mqConsumer"
server="localhost:9590"
topic="QUEUE_OUT_NAME"/>
Now the environment configuration is ready and you can start writing a test that will send a message as an MQ Producer and after working through the SUT, the test MQ Consumer will receive a message that will be checked for the expected result.
So, a Citrus test would look like this:
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"));
}
}
The Kafka infrastructure (“embeddedKafka” bean) is automatically started with the test. So the Citrus Kafka producer endpoint just needs to connect to the Kafka server broker. The test sends a message to a queue and then receives a message from another queue and checks the result.
Of course don't forget to configure your SUT to interact with your “embeddedKafka”.
That's all for now. I wish you successful application of Citrus framework solutions in your test projects!)