Apache Beam - 使用无界PCollection进行集成测试

时间:2017-06-23 18:28:32

标签: java integration-testing google-cloud-dataflow google-cloud-pubsub apache-beam

我们正在为Apache Beam管道构建集成测试,并且遇到了一些问题。请参阅下文了解背景信息......

有关我们管道的详细信息:

  • 我们使用PubsubIO作为我们的数据源(无界PCollection
  • 中级转换包括自定义CombineFn和非常简单的窗口/触发策略
  • 我们的最终转换是JdbcIO,使用org.neo4j.jdbc.Driver写入Neo4j

目前的测试方法:

  • 在运行测试的计算机上运行Google Cloud的发布/订阅模拟器
  • 构建内存中的Neo4j数据库并将其URI传递给我们的管道选项
  • 通过调用OurPipeline.main(TestPipeline.convertToArgs(options)
  • 运行管道
  • 使用Google Cloud的Java Pub / Sub客户端库将消息发布到测试主题(使用Pub / Sub仿真器),PubsubIO将从
  • 读取
  • 数据应该流经管道并最终命中我们的内存中的Neo4j实例
  • 在Neo4j中对这些数据的存在做出简单的断言

这是一个简单的集成测试,它将验证我们的整个管道是否按预期运行。

我们目前面临的问题是,当我们运行我们的管道时,它会阻塞。我们正在使用DirectRunnerpipeline.run() pipeline.run().waitUntilFinish()),但测试似乎在运行管道后挂起。因为这是一个无界PCollection(在流模式下运行),管道不会终止,因此不会到达任何代码。

所以,我有几个问题:

1)有没有办法运行管道然后稍后手动停止?

2)有没有办法异步运行管道?理想情况下,它只会启动管道(然后将继续轮询Pub / Sub获取数据),然后转到负责发布到Pub / Sub的代码。

3)这种集成测试方法是否合理,或者是否有更好的方法可能更直接?任何信息/指导将不胜感激。

如果我可以提供任何其他代码/上下文,请告诉我们 - 谢谢!

1 个答案:

答案 0 :(得分:9)

您可以通过将DirectRunner管道选项设置为isBlockOnRun,使用false异步运行管道。只要您保留对返回的PipelineResult可用的引用,对该结果调用cancel()就应该停止管道。

对于第三个问题,您的设置似乎合理。但是,如果您希望对管道进行较小规模的测试(需要较少的组件),则可以将所有处理逻辑封装在自定义PTransform中。这个PTransform应该接受从输入源完全解析的输入,并产生尚未为输出接收器解析的输出。

完成此操作后,您可以使用Create(通常不会执行触发)或TestStream(这可能取决于您构建TestStream的方式){ {1}}生成有限数量的输入数据,将此处理DirectRunner应用于PTransform,并在输出PCollection上使用PAssert来验证生成的管道你期望的产出。

有关测试的更多信息,B​​eam网站在Programming Guideblog post中提供了有关这些测试样式的信息,其中包含使用PCollection测试管道的信息。