mock 测试是一种很常见的测试手段,可以任意伪造数据进行健壮性测试。
对于小团队而言可以使用本地代理软件快速达成这一目的。代理的一个好处是,不必修改客户端、服务端,因为它是一个中间层。
一般操作系统、浏览器、手机都会提供配置代理的入口,所以,一般只需要配置信任证书就可以了。
这一步是实现 mock 的核心原理,以 mitmproxy 为例,有两种实现方式:
一、拦截请求
def request(self, flow: mitmproxy.http.HTTPFlow):
if 'target.com' in flow.request.host:
# 篡改请求地址
flow.request.headers['X-ORIG-URL'] = flow.request.url
flow.request.scheme = 'http'
flow.request.host = 'mock.com'
flow.request.port = 8000
二、拦截响应
def response(self, flow: mitmproxy.http.HTTPFlow):
if 'target.com' in flow.request.host:
rsp = requests.post('http://mock.com:8000/api/query', data={
"req_url": flow.request.url,
"req_text": flow.request.text,
"rsp_code": flow.response.status_code,
"rsp_text": flow.response.text,
}, verify=False, proxies={"http": None, "https": None})
if rsp.ok and rsp.text:
# 篡改响应
flow.response.set_text(rsp.text)
这两种方案都能达到 mock 的目的,各有优缺点,这里不展开。
mock 数据可以是模板字符串(使用模板语法),动态编译成实际的响应。
以 Cheetah 为例,模拟延迟响应或者随机数生成:
#import random
{"errcode":0,"result":{"count":${random.randint(1, 1000)}}}
这样灵活性就可以得到很大的提升。
通过管理后台,实现 mock 数据的管理和快速切换,其应当具备的基本功能:
最后,附一个实现原型参考:
Copyright © 2015-2022 BY-NC-ND 4.0