ZooKeeper, Kafka和Spark是当下流行的大数据平台工具之一。这两年得到飞速的发展,国内厂商也越来越多的使用它们。
本站有多篇文章介绍了它们的开发指南, 如:
官方网站提供了很多的代码例子,互联网上也有很多的开发例子,你可以很容易的学习如果编写基于这些平台框架的技术。
但是如何为这些应用编写单元测试呢? 本文提供了几种编写单元测试的技术。
所有的例子都可以在 这里 找到。
为ZooKeeper应用编写单元测试
一般我们不直接使用ZooKeeper的API编写Client代码,而是使用Curator或者i0itec-zkclient等包装的API开发。
原因是ZooKeeper本身提供的API太过底层,我们需要处理各种异常,并且API使用不方便。
有几种方式可以实现一个ZooKeeper simulator。
- Curator TestingServer
Curator提供了一个TestingServer类,可以模拟ZooKeeper,用来测试Curator应用或者其它使用ZooKeeper的应用。
你需要在pom.xml中引用curator-test:
|
|
测试代码如下:
|
|
- EmbeddedZookeeper
Kafka为了它的单元测试实现一个嵌入式的ZooKeeper,代码相当简单:
|
|
测试工具类:
|
|
- 自己实现
Kafka的类无法直接在java中使用,你可以使用一些花招, 比如把trait改为abstract class改造使用。
我们可以参考Kafka的scala代码使用java自己实现一个, 主要例如org.apache.zookeeper.server.ZooKeeperServer
和org.apache.zookeeper.server.NIOServerCnxnFactory
。
如这个代码: gist
或者如stackoverflow上讨论的:
|
|
为Kafka应用编写单元测试
Kafka代码本身就提供了单元测试,所以我们编写Kafka producer应用和consumer应用时可以参考这些应用。
你可以在线查看这些单元测试以及它们可以重用的文件: kafka单元测试类
KafkaServerTestHarness 提供了一个基本测试trait:
|
|
以及提供一个初始化好producer和consumer的Trait:
|
|
如果你想在代码中使用它们,你需要引入:
|
|
如果你想在Java直接实现这些trait是不可以的,这些Trait都有实现方法,在Java中无法直接使用,可能你需要把trait改为abstract class。 或者你使用它的TestUtils创建。
|
|
为Spark应用编写单元测试
如果是为普通的Spark应用编写单元测试代码, 比较简单,创建SparkContext时只需将master设为local
即可。确保在finally或者teardown方法中调用SparkContext.stop(),因为Spark不允许在同一个程序中拥有两个SparkContext。
以SparkPi为例。
|
|
单元测试类:
|
|
对于Spark Streaming应用, 单元测试相对复杂,因为你需要集成其它的框架。
如果你的应用集成Kafka,你可以使用上面的Kafka的测试类,
如果你的应用集成Mongo,你可以使用真实的Mongo或者fake Mongo如Fongo,
如果你的应用集成TCP 流, 你需要实现一个TCP server simulator,
基本上你应该寻找或者实现要集成的框架的simulator。