0

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

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

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

4

1 回答 1

1

这里有许多选项,具体取决于您可以忍受的减速类型:

  • 正如您所提到的,您可以启动 Kafka、Cassandra 和拓扑。这是最慢的选择,也是“最现实的”。

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

  • 在测试中用存根替换 Kafka spouts/bolts 和 Cassandra bolt。Storm 内置了许多用于 stubing bolts 和 spout 的工具,例如 FixedTupleSpout、FeederSpout、跟踪拓扑和 LocalCluster 中可完成的拓扑功能。这样,您可以将一些固定的元组插入到拓扑中,并断言哪些元组被发送到 Cassandra 螺栓存根。这里这里有一些这个功能的例子

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

于 2019-07-12T16:16:52.593 回答