【问题标题】:How to do unit tests of a storm topology?如何进行风暴拓扑的单元测试?
【发布时间】:2016-03-23 17:00:00
【问题描述】:

我一直在开发风暴拓扑,但是我仍然发现我缺乏一种正确的方法来对已创建的螺栓和喷口进行单元测试,而无需启动拓扑并向自己发送流量。 拓扑中使用的服务是分离的并经过单元测试,但它们的使用或拓扑内容仍然可能存在错误(元组不正确等)。 为了解决这个问题,在我的项目中创建单元测试的方法是什么? 谢谢。

【问题讨论】:

  • 听起来更像是您不是在谈论单元测试,而是在谈论下一步 - 集成测试。
  • 好吧,我确实添加了集成测试,它有很大帮助:) 但它很慢,对我来说,检查我的拓扑是否正确以及每个印迹是否发送/处理正确的元组等基础知识可以进行单元测试但我不确定最好的方法是什么。可能有 Mockito,但我希望有更好的东西。

标签: java apache-storm


【解决方案1】:

为螺栓创建单元测试有点复杂,但是可以在不部署拓扑的情况下。 您可以创建一个实现 IOutputCollector 的测试类 和另一个实现元组的测试类。 您应该实现您使用的方法并可能存储发出的元组。

之后,您可以使用以下代码创建 Bolt 的单元测试。

MockOutputCollector c = new MockOutputCollector();
Bolt b = new Bolt();
b.prepare(c,null,null);
MockTuple tuple = new MockTuple(fields,Arrays.aslist({"a,b,c"}));
b.execute(tuple);
List result = c.getEmittedTuples().get(0);

【讨论】:

    【解决方案2】:

    我不知道您正在执行的处理的复杂性,但测试螺栓的一种简单方法是创建另一个螺栓,在执行方法中对元组内容进行断言(使用您最喜欢的测试框架)。

    class AssertOutput extends BaseOperation implements Function {
    
            private AssertOutput() {
            }
    
            @Override
            public void execute(final TridentTuple tuple, final TridentCollector collector) {
    
                final List<Object> values = new ArrayList<>();
    
                for (final Object obj : tuple.getValues()) {
                    values.add(obj);
                }
            }
    }
    

    因此,在单元测试中,您可以通过使用 AssertOutput bolt 调用每个方法来轻松检查 bolt 的输出。

    这是我知道自动检查元组内容的唯一方法。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多