我们的Apache Storm拓扑使用KafkaSpout侦听来自Kafka的消息,并在进行大量映射/缩减/富集/聚合等之后,最终将数据插入Cassandra。还有另一个kafka输入,如果拓扑找到响应,我们将接收用户对数据的查询,然后将其发送到第三个kafka主题。现在,我们要使用Junit编写E2E测试,在该测试中,我们可以以编程方式直接将数据插入拓扑,然后通过插入用户查询消息,在第三点上断言在查询中收到的响应是正确的。
为此,我们考虑了启动EmbeddedKafka和CassandraUnit,然后用它们替换实际的Kafka和Cassandra,然后可以在此Junit测试的上下文中启动拓扑。
但是我们的方法不适用于JUnit,因为它会使这些测试变得过于庞大。启动kafka,cassandra和拓扑都非常耗时,并且消耗大量资源。 Apache Storm中有什么可以支持我们计划编写的测试?
答案 0 :(得分:1)
这里有许多选项,具体取决于您可以承受的减慢速度:
如上所述,您可以启动Kafka,Cassandra和拓扑。这是最慢的选项,也是“最现实的”选项。
一次启动Kafka和Cassandra,并将其重新用于所有测试。您可以使用Storm LocalCluster执行相同的操作。在每个测试之间(例如删除所有主题)清除Kafka / Cassandra可能比重新启动它们更快。
在测试中用短管代替Kafka喷嘴/螺栓和Cassandra螺栓。 Storm内置了许多工具,可用于固定螺栓和喷口,例如LocalCluster中的FixedTupleSpout,FeederSpout,跟踪的拓扑和可完成的拓扑功能。这样,您可以在拓扑中插入一些固定的元组,并断言将哪些元组发送到Cassandra螺栓桩。这里有一些here和here
最后,您当然可以对单个螺栓进行单元测试。这是最快的一种测试。您可以使用Testing.testTuple创建测试元组以传递到螺栓。