为功能测试构建通用mock server系统(2)

发表于:2013-11-26来源:InfoQ作者:余昭辉点击数: 标签:mock server
版本5(模拟行为) 基本上一个功能还算完善的mock server成型了。但这就够了么?对于要模拟各种场景的测试还远远不够。我们很多接口有回调的功能,我们通

  版本5(模拟行为)

  基本上一个功能还算完善的mock server成型了。但这就够了么?对于要模拟各种场景的测试还远远不够。我们很多接口有回调的功能,我们通常还需要模拟接口超时的情况,而对于一些支付相关的接口经常需要对参数进行加密解密,而且这些情况都需要是可配置的。有没有发现,前面我们介绍的所有实际上都是mock值。也就是我们设置一些值,然后调用的时候将值返回。但是很多时候我们不仅需要mock值,更要mock行为。这样我们有了mock server中最核心的组件:命令执行引擎(好牛的名字,其实就那样)。在设置mock的时候我们不再是设置一个值,而是设置一个预定义命令组合成的流水线(即按照类似下面xml的配置一步一步执行,并且可以将上一步的执行结果传递给下一步):

  1000

  {“ret”:”true”}

  {“ret”:”true”}

  上面的流水线被命令执行引擎解析执行后就是按顺序执行对应的DelayCommand, CallbackCommand以及ReturnCommand命令了,具体命令就不介绍了。采取这种方式给我们mock server带来了很大的灵活性:只需要简单的扩展一个子命令,就可以扩充mock server的行为。比如mock某网关接口时需要使用MD5加密,只需要扩展一个MD5Command(下面代码中的$result表示前一步骤 加密后的结果):

  

  $result

  DSL

  现在我们的mock不仅可以mock值了,对于各种行为的模拟也得心应手。但是要使用方便,还要提供便于使用的接口。Mock server提供两类接口:针对自动化测试的DSL,以及针对手工测试使用的管理界面。这里主要介绍这种DSL(因为我们的测试用例是使用xml编写,转换成编程语言也很容易):

  

  1000

  

  $result

  

  service是对被mock的服务的描述,比如对于SMTP,我们可以这样定义: service="smtp:9000"。这个表示在9000端口上监听smtp协议。而matcher即前面介绍的matcher组件所使用的各种匹配器,用于匹配被测系统调用mock server时传递的数据。比如上面的例子表示的就是如果被测系统调用http接口/ticket.jsp,并且参数里包含orderNo则延迟1秒钟,然后返回一个json值 。

  总结

  前面几节介绍了一个比较完善的通用mock server从简到繁演化的设计思路,希望可以为想要构建类似设施的读者提供一个参照。

  这个mock系统包含两个主要部分:mock admin和mock server。Mock admin是管理界面,主要提供监控(可以在界面上实时看到被测系统与mock server交互)以及手工测试时的配置界面。 Mock server即前面介绍的主体,其架构如上图所示。Mock server包含几个核心组件:协议、extractor、matcher、命令执行引擎、存储(即mock server中使用的各种数据的存储)。Mock server提供三类接口:配置、被mock接口(各种服务,通过协议组件提供)、查询。

原文转自:http://www.infoq.com/cn/articles/auto-test-mock-server?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk