高效接口测试(七)

02 更智能地模拟数据:如何开发好的Mock服务

2.3 改造我们的Mock服务--Anyproxy+Moco

我们再来回顾一下本章第一小节说到的Mock服务原理

1.jpg

1. 现有服务的缺点

如果我们需要将原本发送给服务端模块的请求,转发到Mock服务上,该如何处理呢?有的同学可能会说,让开发人员把调用接口地址的Host换掉。比如最初的前端页面或后端服务都需要调用http://alipay.com/pay接口,我的Mock服务在http://192.168.1.1/pay,那就让开发人员把Host换成192.168.1.1,后面具体路径我在搭建Mock服务的时候尽量保持一致即可。

显然开发人员是不太情愿帮你做这件事的。那么如何在不修改待测系统配置的情况下完成切换呢?最简单的方式--修改本地Host文件,将alipay.com 映射到 192.168.1.1

但是重要的问题也随之而来了,修改Host之后,所有alipay.com的请求都会被映射到192.168.1.1,那么其他的接口服务,比如login、search,不需要进行Mock如何处理呢?

  • 使用抓包工具过滤请求。日常的抓包工具都具有这个功能,核心原理就是:开启Http代理,将地址符合某些匹配规则的请求截获,并转发到Mock服务上。
  • 抓包工具毕竟要开,要手动设置,只能算是半自动化。使用AnyProxy、MitmProxy(后面章节我会单独讲解如何使用它做接口用例的录制)。本节先有请AnyProxy登场。

我们的目标架构:

2.png

2. Anproxy的使用

AnyProxy 是一个基于 Node.js 的代理服务器。代理服务器是个中间人,站在了客户端和服务端中间,双方通信的每个比特,都会滴水不漏地经过它。它控制了完整的请求头、请求体、响应头、响应体,可以在客 户端与服务端都无感知的情况下介入处理所有的流程。

官方地址:http://anyproxy.io/cn/

特点:
  • 支持 https 明文代理

  • 支持低网速模拟

  • 支持二次开发,可以用 javascript 控制代理的全部流程,搭建前端个性化调试环境

  • 提供web版界面,观测请求情况

安装与配置

npm install anyproxy -g

anyproxy --version显示版本号,说明安装成功。

启动 Anyproxy

anyproxy

但是这样启动anyproxy只能代理http,如果要能代理https,需要执行生成ca证书的命令

anyproxy-ca

回车确认下去既可,然后执行以下命令来启动anyproxy。就可以代理https了

anyproxy -i

如果在浏览器中使用的话去设置代理就好了,如果是移动设置使用的话,连接在对应启动服务器的笔记本电脑中wifi,在wifi中设置对应的代理即可,和fiddler设置代理的操作是一样的。

3.jpg

访问本地8002端口,会看到Anyproxy的前端配置管理页面。

编写Anyproxy的控制代理的规则

进行这一步的前提是你已经开启了Moco,并且像上一小节一样,配置了几个Mock接口服务。然后就要开始配置Anyproxy的转发策略了。

这里使用了Anyproxy的加载外部规则命令

anyproxy --rule sample.js

sample.js是一个外部js文件,用来控制转发策略。我们通过编写该文件实现【客户端在使用被Mock接口时,Anyproxy指向Mock服务器】。js中具体的配置如下。该文件需要保存在Anyproxy的安装路径下的rule_sample目录。

module.exports = {
    summary: 'Rule to modify request data',
    *beforeSendResponse(requestDetail, responseDetail) {
        //这里的意思是:如果URL包含http://alipay.com/pay就修改请求结果,返回一句特定的内容
        if (requestDetail.url.indexOf('http://alipay.com/pay') == 0) {
 
            const newResponse = responseDetail.response;
            var newDataStr = 'i-am-anyproxy-modified-post-data';
            newResponse.body = newDataStr;
 
            return new Promise((resolve, reject) => {
                resolve({ response: newResponse });
            });
        }
    },
};

所有本地的请求会被代理转发到Anyproxy。作为一个选择mock接口的中间工具,Anyproxy发现符合筛选规则的地址,就去请求Moco中的数据返回给客户端,不符合条件的直接放行。这样就能起到对特定接口进行Mock而不影响其他未Mock接口的正常使用的效果。

后记

本章节中讲解了如何搭建一个更加智能的Mock服务。如果你想进一步定制它,为你的团队开发一个Mock在线配置平台并集成到我们的测试平台中,请关注七录学院的测试开发付费课程吧。我们下个小节谈谈如何从UI页面,自动化录制接口测试用例。