自动化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声明式风格使我们能够有效地完成这项工作。

 

KTA-1

挑战


作为一个常识,我们知道卡夫卡的消息没有订购!

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-format-example,在适合您项目要求的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.开始使用实例

CI-2

2. KSQL QUERIES
查看我们用于在不同主题之间移动数据的模拟KSQL查询的快照。

CP-2

 

请仔细检查您的存储库中是否添加了以下依赖项:

<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/src/test/java/org/jsmart/zerocode/integration/tests/kafka/produce/KafkaProduceUniqueClientIdTest.java

KafkaConsumeUniqueGroupIdTest.java:

https://github.com/authorjapps/hello-kafka-stream-testing/blob/master/src/test/java/org/jsmart/zerocode/integration/tests/kafka/consume/KafkaConsumeUniqueGroupIdTest.java
下面是我们在一个测试场景中使用的示例JSON配置:
 

 检测结果

testResult1-1

testpicture2

安全


在Zerocode提供的安全性方面如下:

  1. 对于Oauth2,请在DZone安全区查看一个非常简短且精确的博客:https://dzone.com/articles/oauth2-authentication-in-zerocode如果您需要更多信息,请联系社区或Zerocode。
  2. 对于企业代理配置,您可以按照此处的自述文件部分进行操作:https://github.com/authorjapps/zerocode#soap-method-invocation-where-corporate-proxy-enabled
  3. 这适用于任何Http API调用,例如REST,SOAP等
  4. 具有工作示例的SAML / JWT是:https://github.com/authorjapps/zerocode#using-any-properties-file-key-value-in-the-steps repo
  5. 如果令牌是动态的,那么在运行时将它们注入头部仍然很容易:https://github.com/santhoshTpixler在他的博客中解释过
  6. 如果您使用OpenAM或RedHat SSO或Simple Basic Auth。您可以参考自述文件https://github.com/authorjapps/zerocode#http-basic-authentication-step-using-zerocode中的示例。您可以手动使用每个测试用例或将其嵌入到HttpClient中,这是一次性的(并且维护开销较少)
  7. 自定义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

test1

然后它非常简单直接使用如下 - 

只需注释您的测试类或套件类。

@UseHttpClient(CustomHttpClient.class)

以类似的方式,您可以注入所需的任何自定义标头。

https://github.com/authorjapps/zerocode-hello-world/blob/master/src/main/java/org/jsmart/zerocode/zerocodejavaexec/httpclient/CustomHttpClient.java#L67

例如

testpicture11

特色与未来


在与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