【企业事件平台】自动化Kafka测试
概观
Apache Kafka正在被普遍利用,并且在世界上形成一些大规模和重要的系统,每天处理数万亿条消息。它是许多金融和科技行业公司的管道骨干。
在继续之前,我想提出一些期望。本文的重点不是解释Kafka及其架构的复杂性或用例,而是清楚地说明可用于执行Kafka测试的库之一以及我们的方法和经验。 Zerocode如何允许我们执行集成,单元和端到端(E2E)测试。本文适用于那些已经熟悉Kafka的人,其应用或至少具有很强的理论知识水平。要按照我们的设置,您需要克隆https://github.com/authorjapps/zerocode并安装一些监控工具(Confluent Control Center)。
用例
由于项目的机密性和我们对客户的承诺,我会用我们在测试Kafka时可能遇到的一般情况来打扮我们的用例。请随时通过评论或LinkedIn与您讨论您的具体情况。该项目有30多个微服务,向Kafka生成和使用消息,并对流程中的消息执行某些转换和验证。
我们的方法
我们决定使用Zerocode,因为它的步长链,简单和水平可扩展格式允许我们用简单的JSON格式编写带有效负载和响应断言的测试(利用JSON路径:https://github.com/json-path /JsonPath/blob/master/README.md#path-examples)
Confluent Center(本地)是我们选择的平台,可以获得对测试用例的可视性和监控。
为了模拟我们的测试场景之一(即消息可能来自微服务A然后被消费并需要从微服务B消费和验证)我们向topic_A发出消息并利用KSQL将这些消息写入topic_B并从topic_B和执行断言然后执行另一个KSQL查询以在topic_C上传递该有效负载并重复。 Zerocode的JSON声明式风格使我们能够有效地完成这项工作。
挑战
作为一个常识,我们知道卡夫卡的消息没有订购!
ZEROCODE的建议:
在我们与Zerocode社区的讨论中,可以使用以下选项来解决:
client.id in:/zerocode/kafka-testing/src/test/resources/kafka_servers/kafka_producer.properties
group.id in:/zerocode/kafka-testing/src/test/resources/kafka_servers/kafka_consumer.properties
注意:
在Kafka; client.id:允许您轻松地将代理上的请求与创建它的客户端实例相关联。查看更多示例和详细信息:https://docs.confluent.io/current/clients/producer.html
并且,group.id:property为同一个使用者组中的一组使用者定义唯一标识。您可以在此处了解更多信息:https://jaceklaskowski.gitbooks.io/apache-kafka/kafka-properties-client-id.html?q = group.id
例1:
Zerocode允许您配置例如client.id = zerocode-producer _ $ {RANDOM.NUMBER}以及其他各种占位符。保持其独特性有助于跟踪和测试目的。
通过上面定义的client.id,为每个执行的测试分配一个唯一的ID。
以下示例结果:
第一次运行 - client.id = test_producer_1553209530873
第二次运行 - client.id = test_producer_1553209530889
第3次运行 - client.id = test_producer_1553209530893
此后缀数字ID是唯一的,因为它是当前时间戳的数字等效值。
例2:
Zerocode社区的另一个建议方法是将client.id定义为时间戳,因为它是测试和跟踪的理想选择
client.id = test_producer _ $ {LOCAL.DATE.TODAY:yyyy-MM-dd}
例如
第1天 - client.id = test_producer_2018-03-18
第二天 - client.id = test_producer_2018-03-19
第3天 - client.id = test_producer_2018-03-20
有关其他占位符的信息,请参阅以下链接以定义client.id https://github.com/authorjapps/zerocode#localdate-and-localdatetime-for…,在适合您项目要求的README文件中进行说明。
根据Kafka的要求,group.id在kafka_consumer.properties中定义。
例如group.id = consumerGroup14等
将其定义为唯一可以帮助您实现端到端的测试。此外,这可能会重新运行整个测试套件/包,即使您的CI构建管道可重复。
这种独特性将允许消费者获取旧+新消息(如果它有帮助)。
更多示例和详细信息:https://docs.confluent.io/current/clients/consumer.html
我们的经验和学习
Zerocode允许我们使用带有Java runner(Junit)的JSON配置文件和可配置的Kafka服务器,生产者和消费者属性的Java runner实现这一目标。
我们使用KSQL将数据从一个主题移动到另一个主题,以模拟多微服务的参与,如上所述。
下面分享了一些测试截图:
1.开始使用实例
2. KSQL QUERIES
查看我们用于在不同主题之间移动数据的模拟KSQL查询的快照。
请仔细检查您的存储库中是否添加了以下依赖项:
<dependency>
<groupId>org.jsmart</groupId>
<artifactId>zerocode-tdd</artifactId>
<version>1.3.5</version>
</dependency>
属性配置示例包括:
Producer属性:https://github.com/authorjapps/hello-kafka-stream-testing/blob/master/src/test/resources/kafka_servers/kafka_producer_unique.properties
Consumer属性:https://github.com/authorjapps/hello-kafka-stream-testing/blob/master/src/test/resources/kafka_servers/kafka_consumer_unique.properties
要运行的示例测试用例:
KafkaProduceUniqueClientIdTest.java:
https://github.com/authorjapps/hello-kafka-stream-testing/blob/master/s…
KafkaConsumeUniqueGroupIdTest.java:
https://github.com/authorjapps/hello-kafka-stream-testing/blob/master/s…
下面是我们在一个测试场景中使用的示例JSON配置:
检测结果
安全
在Zerocode提供的安全性方面如下:
- 对于Oauth2,请在DZone安全区查看一个非常简短且精确的博客:https://dzone.com/articles/oauth2-authentication-in-zerocode如果您需要更多信息,请联系社区或Zerocode。
- 对于企业代理配置,您可以按照此处的自述文件部分进行操作:https://github.com/authorjapps/zerocode#soap-method-invocation-where-corporate-proxy-enabled
- 这适用于任何Http API调用,例如REST,SOAP等
- 具有工作示例的SAML / JWT是:https://github.com/authorjapps/zerocode#using-any-properties-file-key-value-in-the-steps repo
- 如果令牌是动态的,那么在运行时将它们注入头部仍然很容易:https://github.com/santhoshTpixler在他的博客中解释过
- 如果您使用OpenAM或RedHat SSO或Simple Basic Auth。您可以参考自述文件https://github.com/authorjapps/zerocode#http-basic-authentication-step-…。您可以手动使用每个测试用例或将其嵌入到HttpClient中,这是一次性的(并且维护开销较少)
- 自定义HTTP客户端:无论如何,Zerocode的Http客户端支持Http和Https连接。但您可以覆盖并添加/删除安全功能以满足您的项目要求。
请参阅示例:https://github.com/authorjapps/zerocode-hello-world/blob/master/src/main/java/org/jsmart/zerocode/zerocodejavaexec/httpclient/CustomHttpClient.java#L46
然后它非常简单直接使用如下 -
只需注释您的测试类或套件类。
@UseHttpClient(CustomHttpClient.class)
以类似的方式,您可以注入所需的任何自定义标头。
https://github.com/authorjapps/zerocode-hello-world/blob/master/src/mai…
例如
特色与未来
在与Zerocode广泛贡献社区的讨论中,关于特征比较前端,Zerocode正在收集来自客户的反馈/数据以捕获对Zerocode的好处和偏好,例如
- 从Postman(collections)到Zerocode
- 从其他基于Step-Definition的BDD工具到Zerocode等。
我们和Zerocode很乐意听取您对此的反馈。
预热
分布式测试非常棘手,没有灵丹妙药,因其独特的角落案例而闻名。要解决这些问题,需要从流程设计到生产的大量设计思路和SDLC(软件开发生命周期)实践。本博客的目标是根据需要分享一些有关如何处理和扩展测试的见解,以及现有的经过深思熟虑和文档选项Zerocode旨在保持质量。
重要的是要清楚地概述Zerocode是特殊的:
- 应用集成测试
- 端到端测试
- 系统集成测试
- 负载/压力测试
- API模拟制作(使用wiremock JSON DSL)
以声明的方式将开发人员/测试人员的麻烦减少到零。
我们选择合适的测试库或框架的结论是:
- 便于使用
- 减少语法开销
- 易于处理和断言有效载荷
- 易于扩展测试跑步者
- 易于添加自定义安全功能
- 便于手动测试人员了解测试流程
我们真诚地希望这能在一定程度上帮助社区,并帮助我们与来自Zerocode的同类精神弥合和填补空白。
尊敬的参考文献
有关如何测试Kafka或REST API生成和使用Kafka的更多详细信息,请参阅以下链接或通过以下评论与我们联系:https://github.com/authorjapps/zerocode
- 209 次浏览