持续创作,加速生长!这是我参加「日新计划 6 月更文挑战」的第27天,点击检查活动概况

咱们好~我是米洛
我正在从0到1打造一个开源的接口测验渠道, 也在编写一套与之对应的教程,期望咱们多多支撑。
欢迎重视我的公众号米洛的测开日记,获取最新文章教程!

回忆

上一节咱们现已能够打通【har文件完成录制=>用例生成】的整体流程。那么这一节咱们就持续把录制相关的逻辑理清楚。

还记得咱们之前抛出的问题不?

我这里其实陆陆续续发现过好几个坑,可是都一一踏平了,今日这节就无私奉献出来,期望有缘人能少踩弯路。

本地不易发觉的问题

为什么问题拖了那么久,那是因为这些问题本地都不简单发觉,只需到了线上才会呈现。举个比如,咱们本地启动的mitmproxy的服务地址是: 127.0.0.1:77778

咱们的恳求通过了署理之后,也仍是127.0.0.1,也就是说ip并没有改变,所以这会导致咱们发现不了问题!!!

今日我要说的问题主要分2类:

  • 第三方云服务器商

    之前咱们截过图,腾讯云会阻拦咱们的mitm.it页面,提示咱们没有存案,这就导致什么?

    对,咱们无法通过mitm.it装置证书。

  • ip问题

    还记得咱们是怎么判定一个用户有没有在录制,录制得怎么样的吗?没错,咱们是依据ip来的,想一下服务上线后,咱们的ip依然是127.0.0.1, 线上咱们或许通过了nginx,也或许通过了其他各类服务器转发, 那咱们的实在ip,他们还能完美拿到吗?

    答案是不一定的。

逐个击破

  • 云服务器商

    抵挡他们,其实没有太多方法。但咱们本地装备署理今后,拜访到mitm.it,能够观察到,对应的证书,咱们是能够下载到的,并且不同操作系统的证书是固定的。

测试平台系列(143) 解决录制用例代理的难题

也就是说咱们在自己的Request客户端里边加上自身署理(云服务器给自己署理),也就是相似requests.get下载mitm.it的文件,但因为要署理才能拜访,所以咱们需要给requests参加proxy相关的参数。

这个我现已封装好了,因为之前核算走mock形式。

云服务器(通过本机署理)拜访mitm.it行得通,所以咱们能够对外露出一个api:下载证书

这个证书只需下载到,咱们就能顺利装置并通过署理拜访到其他页面,为后面录制做铺垫了。

  • ip问题

    这个是困扰我很久的一个问题,先来看第一个。先假设咱们的实在ip都是111.111.111.111,所以咱们对照录制状态这个接口:

测试平台系列(143) 解决录制用例代理的难题

这一块的内容,咱们期望的是依据咱们的实在ip去获取redis里边的数据,但最终走向会是什么呢?

  1. 前端页面建议恳求
  2. 恳求到达服务端nginx
  3. nginx转发到pity实在地址

也就是说,pity收到的恳求,其实是由nginx发给它的,那他拿到的,其实是nginx的ip地址,即nginx服务器地址

这就引发第一个问题,咱们获取不到咱们的录制数据(留意本地并不会呈现哦,只需生产会)。

那么怎么处理呢?咱们的nginx在转发的时分,要带上对应的装备:

测试平台系列(143) 解决录制用例代理的难题

* 留意这个client_max_body_size,默许是1m,这里是har导入的时分报错我修正的。

这3个装备代表,把原始的客户端ip啥的也都持续转发曩昔。如此咱们就处理了第一个问题。

  • 第二个问题

    第二个问题比较粗鲁,因为咱们录制的时分,咱们实际上是走了mitmproxy的署理,可是他也很坏,不给咱们实在ip,只需咱们通过他,通过fastapi获取到的,都是mitmproxy部署的地址。

    通过我不断的探索,终于找到了对应的处理方案,直接上答案。

  1. 修正uvicorn的装备

我是用gunicorn的方法,所以我在gunicorn.py里边修正uvicorn的装备:

# 启动的进程数
workers = multiprocessing.cpu_count()
worker_class = 'uvicorn.workers.UvicornWorker'
forwarded_allow_ips = "*" 
x_forwarded_for_header = 'X-FORWARDED-FOR'

forwarded_allow_ips这个参数是允许forward的ip,我了解的意思是,你重定向/转发今后,持续输送你旧的ip。

其实nginx的装备,也是这个参数,对不,其实咱们命名都很挨近,网络上有些人会要求再改一个header啥的装备,我观察了一下那个装备默许是的,所以不需要了。

改完这个之后,你的mitmproxy就会收到你实在地址,可是这样是不行的。咱们假如录制数据,会走署理,这样咱们的ip会被识别为mitmproxy所在ip。

所以咱们需要持续提升(forward),咱们需要在mitmproxy录制到接口的时分也设置forward

测试平台系列(143) 解决录制用例代理的难题

在插件中,把实在的ip地址forward即可。下面来展示,我在pity.fun这个地址里边录制回放的成果。

劳动成果

  1. 装备署理

测试平台系列(143) 解决录制用例代理的难题

  1. 全程运用pity.fun环境录制

测试平台系列(143) 解决录制用例代理的难题

测试平台系列(143) 解决录制用例代理的难题

测试平台系列(143) 解决录制用例代理的难题


bug警钟,能够看到最后录制结果多了一条开端录制的数据,咱们下期处理它。