基于HAR包的流量录制回放

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 什么是HAR包? HAR(HTTP Archive format),是一种JSON格式的存档格式文件,通用扩展名为 .har。 HAR包是JSON格式的,打开后,重点关注entries里面的request和response,包含了请求和响应信息。 流量录制 怎么获取HAR包呢?可以网上搜索方法,浏览器F12、抓包工具(Charles、Proxyman等)都可以将HTTP请求导出为HAR包。 生产级别的流量录制很复杂,想要了解的话可以参考阿里开源项目:https://github.com/alibaba/jvm-sandbox-repeater 回放对比 本文重点介绍在导出HAR包后,怎么通过Python来实现回放对比。 使用介绍 一、将HAR包转换为pytest用例 har_file为har包路径,profile配置开启回放,调用Har.har2case()方法将HAR包转换为pytest用例。 转换后会生成: demo_test.py 与HAR同名的pytest用例文件 demo-replay-diff 对比结果目录,暂时为空 sqlite.db 存储HAR包响应数据,标记为expect 二、执行pytest用例 from tep.libraries.Diff import Diff from tep.libraries.Sqlite import Sqlite def test(HTTPRequestKeyword, BodyKeyword): var = {'caseId': '023f387db398504889e0afb8dd1bc99d', 'requestOrder': 1, 'diffDir': '/Users/wanggang424/Desktop/PycharmProjects/tep/tests/demo/case/har/demo-replay-diff'} url = "https://postman-echo.com/get?foo1=HDnY8&foo2=34.5" headers = {'Host': 'postman-echo.com', 'User-Agent': 'HttpRunnerPlus', 'Accept-Encoding': 'gzip'} ro = HTTPRequestKeyword("get", url=url, headers=headers) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "GET", "https://postman-echo.com/get?foo1=HDnY8&foo2=34.5"), var) url = "https://postman-echo.com/post" headers = {'Host': 'postman-echo.com', 'User-Agent': 'Go-http-client/1.1', 'Content-Length': '28', 'Content-Type': 'application/json; charset=UTF-8', 'Cookie': 'sails.sid=s%3Az_LpglkKxTvJ_eHVUH6V67drKp0AGWW-.PidabaXOnatLRP47hVyqqepl6BdrpEQzRlJQXtbIiwk', 'Accept-Encoding': 'gzip', 'sails.sid': 's%3Az_LpglkKxTvJ_eHVUH6V67drKp0AGWW-.PidabaXOnatLRP47hVyqqepl6BdrpEQzRlJQXtbIiwk'} body = r"""{"foo1":"HDnY8","foo2":12.3}""" ro = BodyKeyword(body) # ro = BodyKeyword(body, {"$.jsonpath": "value"}) body = ro.data ro = HTTPRequestKeyword("post", url=url, headers=headers, json=body) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "POST", "https://postman-echo.com/post"), var) url = "https://postman-echo.com/post" headers = {'Host': 'postman-echo.com', 'User-Agent': 'Go-http-client/1.1', 'Content-Length': '20', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': 'sails.sid=s%3AS5e7w0zQ0xAsCwh9L8T6R7QLYCO7_gtD.r8%2B2w9IWqEIfuVkrZjnxzm2xADIk34zKAWXRPapr%2FAw', 'Accept-Encoding': 'gzip', 'sails.sid': 's%3AS5e7w0zQ0xAsCwh9L8T6R7QLYCO7_gtD.r8%2B2w9IWqEIfuVkrZjnxzm2xADIk34zKAWXRPapr%2FAw'} ro = HTTPRequestKeyword("post", url=url, headers=headers, data=body) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "POST", "https://postman-echo.com/post"), var) Diff.make(var["caseId"], var["diffDir"]) 执行时会记录实际请求响应,存入sqlite数据库,标记为actual。 ...

Postman竟然还能录制流量

大家好,我是刚哥。

从零开始学mitmproxy抓包工具

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Man In The Middle mitm是Man In The Middle的首字母缩写,意思是位于中间的人,表明mitmproxy是一个代理,可以拦截请求,实现网络抓包。知名的网络抓包工具有Fiddler、Charles、HttpWatch、WireShark、BurpSuite和Postman等,mitmproxy相对来说,没有这么高的知名度,它相比于以上工具的独特优势是,它提供了Python API,可以编写Python代码对网络请求进行流量录制,从而收集接口信息以及转化为接口自动化用例等。mitmproxy官方文档不但有mitmproxy工具使用介绍,还有代理实现原理,对我们学习掌握网络知识有很大帮助。 安装与使用 pip安装 pip install mitmproxy mitmproxy是Python开发的,用pip就能安装成功。官方给出了二进制安装包等方法,我觉得作为一款用Python开发的工具,用pip直接安装是更Pythonic的。 命令启动 可以通过3种命令启动mitmproxy: mitmproxy 控制台 mitmweb 网页 mitmdump 命令行 它们的内容都是一样的,只是UI不一样而已。 手动设置代理 打开以后mitmproxy默认会监听http://localhost:8080,需要设置下代理,把代理服务器设置为这个地址。 Windows可以这样设置: 设置后一定要记得点击保存按钮,否则代理不会生效。 实际上,Charles等网络抓包工具会自动配置代理,而mitmproxy需要手动设置代理,开发团队的解释是因为浏览器版本和配置经常会变化,所以他们建议在网上根据环境搜索方法手动设置。 下载证书 访问http://mitm.it/,如果代理配置没有生效,打开后会是这个界面: 正常的话,会出现证书下载页面: 根据平台选择相应证书安装就OK了。 使用 mitmproxy更其他抓包工具用法类似。 官方用视频演示了mitmproxy如何使用: https://docs.mitmproxy.org/stable/mitmproxytutorial-userinterface/ 并且介绍了5种运行模式: https://docs.mitmproxy.org/stable/concepts-modes/ 读者可以自行阅读下。 mitmproxy工作原理 客户端(本机)连接代理服务器(http://127.0.0.1:8080),代理服务器连接服务器。 客户端给代理服务器发请求,代理服务器把请求发送到服务器。 所有请求经过mitmproxy,就可以实现请求拦截。 对于HTTP来说,直接借助mitmproxy传递请求就可以。而对于HTTPS来说,有个SSL/TLS安全认证,必须安装证书,服务器才会认为mitmproxy的请求是可信任的,请求才会成功传递。 HTTPS的代理过程就要复杂很多,客户端先跟mitmproxy建立连接(12步),然后进行安全认证(36步),最后传递请求(7~8步)。 反向代理 假设在本机使用FastAPI启动了个Mock服务,地址为http://127.0.0.1:5000,通过Postman调接口,怎么使用mitmproxy来拦截请求呢?这就需要用到反向代理。 首先以反向代理模式运行mitmproxy,服务器端口为5000,监听端口为8000: mitmproxy --mode reverse:http://127.0.0.1:5000 --listen-host 127.0.0.1 --listen-port 8000 然后把请求http://127.0.0.1:5000/login里面的5000端口改成8000,访问: http://127.0.0.1:8000/login 就能在mitmproxy看到抓到请求了: 这样就能在本地使用Mock服务来调试拦截请求的Python代码了。 反向代理,不需要在本机手动设置代理。 Python API Python API是mitmproxy的特色功能: ...