See You Again

基于代理的 mock 实现方案

mock 测试是一种很常见的测试手段,可以任意伪造数据进行健壮性测试。

对于小团队而言可以使用本地代理软件快速达成这一目的。代理的一个好处是,不必修改客户端、服务端,因为它是一个中间层。

一般操作系统、浏览器、手机都会提供配置代理的入口,所以,一般只需要配置信任证书就可以了。

代理插件

这一步是实现 mock 的核心原理,以 mitmproxy 为例,有两种实现方式:

一、拦截请求

  1. def request(self, flow: mitmproxy.http.HTTPFlow):
  2. if 'target.com' in flow.request.host:
  3. # 篡改请求地址
  4. flow.request.headers['X-ORIG-URL'] = flow.request.url
  5. flow.request.scheme = 'http'
  6. flow.request.host = 'mock.com'
  7. flow.request.port = 8000

二、拦截响应

  1. def response(self, flow: mitmproxy.http.HTTPFlow):
  2. if 'target.com' in flow.request.host:
  3. rsp = requests.post('http://mock.com:8000/api/query', data={
  4. "req_url": flow.request.url,
  5. "req_text": flow.request.text,
  6. "rsp_code": flow.response.status_code,
  7. "rsp_text": flow.response.text,
  8. }, verify=False, proxies={"http": None, "https": None})
  9. if rsp.ok and rsp.text:
  10. # 篡改响应
  11. flow.response.set_text(rsp.text)

这两种方案都能达到 mock 的目的,各有优缺点,这里不展开。

动态响应

mock 数据可以是模板字符串(使用模板语法),动态编译成实际的响应。

Cheetah 为例,模拟延迟响应或者随机数生成:

  1. #import random
  2. {"errcode":0,"result":{"count":${random.randint(1, 1000)}}}

这样灵活性就可以得到很大的提升。

管理后台

通过管理后台,实现 mock 数据的管理和快速切换,其应当具备的基本功能:

最后,附一个实现原型参考:

2020-08-05 喜欢

Copyright © 2015-2020 BY-NC-ND 4.0

回到顶部 ↑