如何通过以编程方式插入消息来 E2E 测试 Storm 拓扑的功能

How to E2E test functionality of Storm Topology by programmatically inserting messages

我们的 Apache Storm 拓扑使用 KafkaSpout 侦听来自 Kafka 的消息,并在执行大量 mapping/reducing/enrichment/aggregation 等操作后最终将数据插入 Cassandra。还有另一个 kafka 输入,如果拓扑找到响应,我们会在其中接收用户对数据的查询,然后将其发送到第三个 kafka 主题。现在我们想使用 Junit 编写 E2E 测试,我们可以直接以编程方式将数据插入拓扑,然后通过插入用户查询消息,我们可以在第三点断言我们的查询收到的响应是正确的。

为了实现这一点,我们考虑启动 EmbeddedKafka 和 CassandraUnit,然后用它们替换实际的 Kafka 和 Cassandra,然后我们可以在这个单一 Junit 测试的上下文中启动拓扑。

但是我们的方法不太适合 JUnit,因为它使这些测试过于庞大。启动kafka、cassandra和topology都非常耗时和消耗大量资源。 Apache Storm 中有什么可以支持我们计划编写的测试吗?

这里有多种选择,具体取决于您可以忍受哪种减速:

  • 正如你所说,你可以启动Kafka、Cassandra和拓扑。这是最慢的选项,"most realistic".

  • 启动 Kafka 和 Cassandra 一次,并在所有测试中重复使用它们。您可以对 Storm LocalCluster 执行相同的操作。在每次测试之间清除 Kafka/Cassandra(例如删除所有主题)而不是重新启动它们可能会更快。

  • 在测试中用存根替换 Kafka spouts/bolts 和 Cassandra bolt。 Storm 有许多内置工具用于连接螺栓和喷口,例如FixedTupleSpout、FeederSpout、LocalCluster 中的跟踪拓扑和可完成拓扑功能。通过这种方式,您可以将一些固定的元组插入到拓扑中,并断言将哪些元组发送到 Cassandra bolt 存根。有一些此功能的示例 here and here

  • 最后,您当然可以对单个螺栓进行单元测试。这是最快的一种测试。您可以使用 Testing.testTuple 创建测试元组以传递给螺栓。