如何自动化 Kafka 测试

How to automate Kafka Testing

我们开发了一个系统,使用 kafka 对数据进行排队,然后使用该数据为用户下订单。
我们已经手动测试了某些东西,但现在我们的目标是自动化该过程。
有客户端可以测试吗?我找到了使用 kafka 客户端本身对其进行单元测试的方法,但我的目标是测试整个系统。

编辑:我们的目的只是 API 测试,即只是后端,而不是 UI

您可以在集成测试中以编程方式启动 Kafka,Kafka 使用 Zookeeper,因此请先查看 Zookeeper TestingServer - 此实例 class 使用给定端口创建并启动 Zk 服务器。

接下来看KafkaServerStartable.scala,你必须提供指向内存Zk服务器的配置并调用startup()方法,这里是一些代码:

import kafka.server.KafkaConfig; 
import kafka.server.KafkaServerStartable;
import java.util.Properties;

public KafkaTest() {
    Properties properties = createProperties();
    KafkaConfig kafkaConfig = new KafkaConfig(properties);
    KafkaServerStartable kafka = new KafkaServerStartable(kafkaConfig);
    kafka.startup();
}

希望这些帮助:)

您可以通过在 docker 容器中启动 Kafka 来进行集成测试或端到端测试。如果你使用 Apache kafka-clients:2.1.0,那么你在生产时不需要在 API 级别处理 ZooKeeper或使用记录。

Dockerizing Kafka,测试有助于覆盖单节点以及多节点Kafka集群中的场景。这样你就不必针对 Mock/In-Memory Kafka 进行一次测试,然后再针对真正的 Kafka 进行测试。这可以使用 TestContainers.

来完成

如果你有太多的测试场景需要覆盖,你可以选择Kafka Declarative Testing类似docker-compose的风格,这样你就可以消除Kafka客户端API编码。

在此处查看一些方便的示例以验证 produce and consume

TestContainers 项目还支持 docker-compose。

据我了解,您想从消息开始实施端到端测试。我和一些人最近对使用 Kafka 测试 Event-driven 系统的库、工具和框架进行了研究。

我们发现了 Zerocode,它是一种使用 JSON 或 YAML 等声明性语言的自动化 API 测试。它支持 REST、SOAP 和我们感兴趣的消息传递。它发送和消费来自主题的消息并最终做出断言,易于学习和使用。这里是 link 以获取更多详细信息 Zerocode。虽然我们开始使用它,但它似乎是一个不错的选择。

您将需要 Kafka 代理和依赖项 运行 才能使此解决方案正常工作,但没有什么比 docker 编写 and/or 一些脚本来提供测试环境更好的了。

另一种方法是使用 Kafka 库实现您自己的项目,并使用这些库在测试中发送和接收消息。

很遗憾,我们找不到更多可用选项。 Kafka 有一个创建 test kit 的提议,但尚未进行。

不幸的是,Pavel 描述的方法不再适用于 Kafka 2.8+。但是,我可以使用 KarelDB:

所采用的方法对 Kafka 3.2 进行我们的 end-to-end 测试。
Properties props = TestUtils.createBrokerConfig(
        brokerId,
        zkConnect,
        false,
        false,
        TestUtils.RandomPort(),
        noInterBrokerSecurityProtocol,
        noFile,
        EMPTY_SASL_PROPERTIES,
        true,
        false,
        TestUtils.RandomPort(),
        false,
        TestUtils.RandomPort(),
        false,
        TestUtils.RandomPort(),
        Option.<String>empty(),
        1,
        false,
        1,
        (short) 1
);
KafkaConfig config = KafkaConfig.fromProps(props);
KafkaServer server = TestUtils.createServer(config, Time.SYSTEM);

// `createServer` will also start your Kafka server.

// To shutdown:
server.shutdown();