使用Kafka在Spark Streaming上运行的应用程序的功能测试

时间:2017-02-22 12:13:52

标签: apache-spark apache-kafka spark-streaming functional-testing

我正在为使用Spark Streaming和Kafka运行的应用程序设置功能测试。要完成的步骤是

  1. 启动zookeeper服务器
  2. 启动kafka服务器
  3. 启动消息生产者以向kafka提供必要的数据
  4. 启动Spark Streaming应用程序
  5. 等待5分钟
  6. 停止消息制作者
  7. 停止Spark Streaming应用程序
  8. 停止kafka服务器
  9. 停止使用zookeeper服务器
  10. 验证输出
  11. 除了简单的bash脚本之外,执行此操作的专业方法是什么?

    我认为这是一个非常普遍的问题,与Spark Streaming和Kafka没有严格的关系。也许有一些测试框架支持设置环境,并行运行多个进程以及数据验证/断言。

2 个答案:

答案 0 :(得分:1)

  

也许有一些测试框架支持设置环境,并行运行多个进程以及数据验证/断言。

不幸的是,那里没有一体化的框架。

单行答案是:使用docker-compose和您选择的最简单的单元测试或基于小黄瓜的框架

将上述步骤考虑为:

  1. 启动环境

  2. 生成Kafka消息/验证

  3. 关闭环境

  4. Docker-Compose将是步骤#1和#3的最佳选择。

    version: '2'
    services:
      kafka:
        # this container already has zookeeper built in
        image: spotify/kafka
        ports:
          - 2181:2181
          - 9092:9092   
      # its just some mock-spark container, you'll have to replace it with 
      # docker container that can host your spark-app
      spark: 
        image: epahomov/docker-spark:lightweighted
        depends_on:
          - kafka 
    

    撰写文件的想法是你可以用一个命令启动你的env:

    docker-compose up

    环境设置可以在开发机器和构建服务器之间轻松移植。

    对于步骤#2,任何测试框架都可以。

    场景如下:

    • 启动环境/确保启动环境
    • 开始生成消息
    • 断言/睡觉我的甜言蜜语
    • 关闭环境

    谈论框架:

    • Scala:Scalatest。在那里,你可以有很好的异步断言和并行处理。

    • Python:Behave(注意那里的多处理)或单元测试框架,例如pytest

    不要让命名"单元测试框架"迷惑你 只有测试环境才能定义测试是单元,模块化,系统还是集成,而不是工具。

    如果一个人使用单元测试框架并在那里写 MyZookeeperConnect("192.168.99.100:2181")它不再是单元测试,即使是单元测试框架也无法帮助它:)

    将步骤#1,#2,#3粘合在一起 - 简单的bash将是我的选择。

答案 1 :(得分:1)

考虑使用Citrus(http://citrusframework.org/)测试框架,它可能是您的一体化测试框架。

  • Zookeeper访问:检查
  • Docker集成:检查
  • 通过Apache Camel进行Kafka集成: check
  • 等待x段时间:检查
  • 验证结果:检查

还考虑使用Fabric8 Docker Maven插件(https://github.com/fabric8io/docker-maven-plugin)在同一构建运行中执行Citrus测试之前设置Docker测试环境。

以下是两个协同工作的示例的示例:https://github.com/christophd/citrus-samples/tree/master/sample-docker