最近小编的同事在编写测试工具时,遇到了一个技术难点,经过我们的沟通实践后,解决了该问题。今天在这里与各位小伙伴们一起分享一下。
背景信息
有一个简单的客户端与服务器的交互逻辑:
针对服务器B,目前已知的信息如下:
我们要做什么?
验证程序A在接收到第三方接口返回的数据后,进行后续操作的正确性。
我们遇到的问题?
解决方案
针对以上的背景与问题,我们制定了如下的解决方案:
具体步骤
在这里我们选取了Python+mitmproxy搭建本地的代理服务器。
第一步:安装python3.x+mitmproxy;
输出内容:
Mitmproxy: 5.0.1
Python: 3.7.4
OpenSSL: OpenSSL 1.1.0j 20 Nov 2018
Platform: Windows-10-10.0.18362-SP0
第二步:编写修改网络请求包的脚本插件;
mitmproxy 这个库提供了一项功能,即服务启动时可加载一个脚本,该脚本可以将符合条件的请求数据包内容进行定制化的修改,包括request和response的内容。
第三步:启动服务加载插件。
mitmweb -s addons.py
实例进行演示:
下面通过一个实例来简单说明我们是如何做到的。
addons.py
import test
addons = [
test.TestCase()
]
test.py
import mitmproxy.http
from mitmproxy import ctx, http
class TestCase:
def response(self, flow: mitmproxy.http.HTTPFlow):
str = 'This is a test page!'
if flow.request.url == "http://www.sogou.com/":
flow.response = http.HTTPResponse.make(200)
flow.response.set_text(str)
else:
return
runtest.py
import requests
url = 'http://www.sogou.com/'
response = requests.get(url)
print(response.text)
配置IE代理服务器:
启动代理服务器
mitmweb -s addons.py
演示结果:
1. 执行测试程序runtest.py得到如下结果如下:
2. 使用浏览器访问的结果如下:
至此,我们的问题已经得到了解决,但是另外一个想法又在脑袋里生成。
猜想:
当前团队使用的是一套开源的Mock Server,客户端可以通过配置Host,直接访问自定义返回的内容,但是这其中存在一个问题。当某一个功能需要同时请求一个Host中的两个接口A、B时,如果A的返回值需要自定义,B的返回值需要从原始线上获取,那么当前的Mock Server就无法解决了。原因是Mock Server无法为同一个域下的请求,同时提供访问两台不同实体服务器的功能,即无法提供代理功能。
所以我们想到了,如果在mitmproxy的基础上进行二次开发,那么我们就可以搭建一套既可以自定义返回又可以直接访问线上服务的Mock Server了。
后续我们团队会在这个猜想的基础上进行规划和实施,待有具体产出时再与大家进行分享,也欢迎大家一同交流。