Welcome

首页 / 软件开发 / 数据结构与算法 / 详解为功能测试构建通用mock server系统

详解为功能测试构建通用mock server系统2013-10-04 infoq 余昭辉mock在单元测试中已经众所周知。现今我们有各种功能强大而又好用的mock框架,可以很方便的解除单元测试中各种依 赖,这大大的降低了编写单元测试的难度。而测试驱动开发(TDD)更进一步将mock作为一种设计手段,来辅助识别出元素 之间交互的接口和职责。

那么在功能测试(这里提到的功能测试指的是用户级测试)这个层次,是否有必要使用mock 呢?如果有必要又将如何构建呢?或者说是否有可能像单元测试中那样构建一个通用的mock server系统呢?本文将根据我 的实践经历,向大家介绍一个通用mock server系统的主要组成部分以及设计思路。

Why

现今的业务系统很 少孤立存在,它们或多或少需要使用兄弟团队或是其他公司提供的服务,这为我们的联调和测试造成了麻烦。对于这种情况 ,我们常见的解决方案是搭建一个临时的server,模拟那些服务,提供数据进行联调和测试。这就是mock server的雏形。 一般来讲,搭建这种mock server系统比较简单,不过它的功能也比较简单,而且往往需要针对不同的接口重复开发。那有 没有可能像单元测试中使用的mock框架那样构建一个通用的mock server系统呢?

How

观察单元测试中的 mock框架,我们会发现一般使用mock的流程是:

init mock//创建mock对象config mock //设置mock期望setup mock //将mock对象设置给被测对象call //调用被测接口,被测接口里的代码会调用mock对象verify //验证拿mockito举例:User expected = new User(“admin”, “12345”);//initUserDAO dao = mock(UserDAO.class);//configwhen(dao.findByName(“admin”)).thenReturn(expected);//setupUserService service = new UserService(dao);//callUser actual = service.login(“admin”, “12345”);//verify or assert
借鉴这种做法,我么就可以构建一个简单的mock server系统,接下来的内容中,我们会在这 个mock server的基础上演化出比较完善的版本。

版本1(简单的模拟值)

假设我们需要mock的是HTTP接口。我 们的mock server提供一个配置接口(对应着上面的config mock步骤),测试运行之前调用配置接口将需要mock的HTTP接口 URL以及需要返回的值传递过去,mock server内部建立url 到返回值的关联(这里就类似存在一个哈希表一样)。Mock server还提供另外一个接口供被测系统调用。这是一个通用的接口,所有原先指向真实服务的地址全部被指向到该接口(可 以通过修改配置或修改系统hosts文件)。当该接口被调用时会寻找刚才建立的url 到返回值的关联,并将mock的值返回。这 样一个非常简单的mock server就构建出来了,对于一些简单的联调场景基本够用。这个时候我们的mock server的原理图如 下面所示: