Mock服务的设计与实现
一、什么是Mock服务/工具
在测试过程中,对于一些不容易构造/获取的对象,创建一个 Mock 对象来模拟对象的服务/工具。比如:在测试过程中,手工构造的数据不能返回我想要的结果,从而导致程序的后续处理走不到我们期待的分支,最终造成测试的不充分。当然,Mock 服务除了有这种能力以外,还有其他优点:
解除依赖
随着现在软件系统架构越来越复杂,一个全流程的测试通常都要走好几个系统/模块,如果各个系统/模块的开发进度不一致,提前开发好的系统/模块要进行测试,这时我们可以依赖 Mock 服务/工具来对已经开发好的系统/模块进行测试。
充分测试
就像上面提到的,在手工测试无法构造出我们想要的数据返回时,Mock 服务能给我们返回任何想要的返回数据,这样有利于我们对程序进行充分的测试。
稳定性保障
在做性能测试时,第三方系统如果不能接收大量请求,那么性能测试将无法进行,这时我们可以使用 Mock 服务模拟第三方系统的返回进行性能测试,同时 Mock 服务返回的数据也会比第三方系统更加稳定可靠,更加有利于我们定位自己系统的性能瓶颈。
自动化测试的支持
如果我们发现,自动化测试的 Case 老是因为环境的不稳定导致失败,这时我们可以使用 Mock服务模拟目标服务的数据返回从而使自动化 Case 能够顺利的运行,保证自动化测试的成功率。
二、Mock服务的优缺点
优点
- 由于其他系统模块出错引起本模块的测试错误,我们可以采用 Mock隔离,避免干预;
- 开发过程中,只要交互双方定义好接口,团队之间可以并行工作,进程互不影响;
- 依赖系统无法响应,或者响应异常时,可以用 Mock Object代替,快速反应,不会影响测试进度;
- 提前接入测试,提高测试效率,当接口定义好后,测试人员就可以创建 Mock,把接口添加到自动化测试环境,提前开始测试,起到测试驱动开发效果;
- 可以有效的增加覆盖,接口涉及入参,或者业务逻辑复杂的情况,某些场景无法通过正常手段进行操作,可以通过 Mock 虚拟模拟;
缺点
测试过程中如果大量使用 Mock,测试的场景失去了真实性,则会导致很多场景没有得到正确的测试,所以不管 Mock 服务功能有多强大,在真实环境下必要的联调测试是必不可少的。
三、Mock服务实现能力
- mock所有http请求
- 可基于url和ip进行匹配
- 返回数据固定
- 可实现注入 随机id,时间戳等数据的替换
- 性能要高
- 返回数据模板化
- 要实现可以迁移
- 追加: 透传
四、Mock服务的基本设计思路
- 第一步:将被测服务请求的第三方服务的地址改为Mock服务的地址;
- 第二步:人工请求Mock服务,添加Mock数据;
- 第三步:正常请求被测服务;
- 第四步:被测服务请求Mock服务,Mock服务返回数据给被测服务;
五、Mock服务的模块设计
gateway
- 负责接收数据的注册,把注册的数据存入数据库;
- 负责接收被测服务发过来的请求,并从数据库中查出匹配的数据返回给被测服务
core
- 核心的逻辑处理,包括注册数据存储逻辑以及返回给被测服务的数据的查询与处理
dao
- 负责数据库层的处理
commons
- 枚举、工具类、POJO类、异常体系、常量等的定义
sdk
- 接口自动化需要用到的一个模块
- 编写接口自动化用例时,向Mock服务发送注册数据,同样是发送给gateway模块接收
- 单独打包给接口自动化框架依赖
manager
- 通过页面录入注册数据,和gateway模块进行关联
六、代码实现
地址: