如何在不复制拓扑的情况下测试Kafka Stream应用程序?使用TopologyTestDriver?

时间:2018-10-25 13:53:41

标签: java apache-kafka apache-kafka-streams

我想我对TopologyTestDriver误解了。

直到现在,当我开发Kafka Stream应用程序时,我在测试环境中连接到真正的Kafka,手动创建并填充了主题,并检查主题外的内容。

为了使测试自动化,我查看了TopologyTestDriver。根据Confluent(https://docs.confluent.io/current/streams/developer-guide/test-streams.html)发布的文档,这似乎是我想要的:

  

[...]通常,您使用KafkaStreams类运行拓扑,该类   连接到您的经纪人[...]。   为了进行测试,运行代理会增加很多复杂性和时间。

     

Streams为KafkaStreams类提供了TopologyTestDriver替代品。它没有外部系统依赖性[...]   钩子,用于验证发送到输出主题的数据[...]。

我关心的是拓扑的位置。在我看到的每个示例中(在Confluent上,在Kafka网站上,...),拓扑是在测试文件中定义的:

private TopologyTestDriver testDriver;
....

@Before
public void setup() {
    Topology topology = new Topology();
    topology.addSource("sourceProcessor", "input-topic");
    .......

    // setup test driver
    Properties config = new Properties();
    ....
    testDriver = new TopologyTestDriver(topology, config);

    // pre-populate store
    .....
}

@After
public void tearDown() {
    testDriver.close();
}

@Test
public void shouldFlushStoreForFirstInput() {
    testDriver.pipeInput(recordFactory.create("input-topic", "a", 1L, 9999L));
    OutputVerifier.compareKeyValue(......);
    Assert.assertNull(........);
}

如何为现有的Kafka Streams应用实施测试?我无法想象必须复制拓扑代码-主文件中的一个版本和测试文件中的一个版本。很难维护。

我现有的应用程序具有直接在main方法中定义的拓扑。我可以通过添加诸如protected static org.apache.kafka.streams.Topology buildTopology() {...}之类的静态方法从主体中提取拓扑设计,并且可以从测试文件中调用此方法。

但是,还有没有更干净的解决方案来执行测试代码中的主代码?

0 个答案:

没有答案