python + pytest 分布式测试方法总结
接口自动化测试平台去年在性能调优上花了很多时间
之前仅仅关注代码能否跑通
断言是否正确
用户的基本要求是否满足
但当平台中出现通过SDK一次性导入6000+案例,领导是个技术控,对耗时要求很严格的情况时
平台中日常的每个接口调用之后sleep 4s的一行代码就闹出了大笑话
6000 + 案例 跑了72分钟
领导在向CTO汇报的时候 能想象到他的尴尬😅
刚好最近有时间
想把这段经历及成果分享下
一、使用的pytest插件
- pytest-xdist (单机多进程&多机多进程模式使用)
- pytest-parallel (单机多线程模式使用)
二、四种执行模式及适用场景
1、单机单CPU
常规模式,不含分布式相关的参数
适用场景:普通的单接口调试时可用
2、单机多线程
args参数中添加 ['--workers=1', '--test-per-workers=8']
其中--workers为进程数(aka进程数),可以是正数或者auto(每个cpu核使用一个worker),默认为1
--tests-per-worker为每个woker的最大并发测试数。可以是正数或者auto(将测试平均分配给最多50个并发测试),默认为1
注:等号后的具体数字需根据实际情况填写
适用场景:研究使用,没有特别的适用场景
3、单机多CPU
args参数中添加['-n', '8']
-n 表示进程数,值一般为2*numcpus, numcpus为cpu核数,cpu核数查询方法见CentOS 系统 查看 cpu核数 - 千鱼千寻 - 博客园 (cnblogs.com)
注:'-n'后的数字需根据实际情况填写
适用场景:适合只有一台可用机器&案例较多,对耗时要求的场景
4、多机多CPU
需要在配置信息中添加机器信息,可参考127.0.0.1 * 8;10.0.196.88 * 4(用;号分隔多机器信息)
循环遍历配置信息中的多机信息
- 若当前遍历到的是本机的配置信息:
则需要在args参数中添加[f"8*popen//python=/usr/bin/python3//chdir={py_dir}"]
(本例中py_dir的位置为testcases所在的位置)
- 若当前遍历到的是其他机器的配置信息:
则需要在args参数中添加[f"4*ssh=root@{ip}//python=/usr/bin/python3//chdir={py_dir}"]
(本例中ip即为其他机器的ip:10.0.196.88, py_dir为testcases所在的位置)
之后,再在args参数中依次添加["--rsyncdir", f"{new_py_dir}", f"new_py_path", f"--alluredir", f"{new_py_dir}" ]
其中new_py_dir为新的test_api.py文件所在的文件夹
new_py_path为新的test_api.py文件
注:8, 4 分别为机器中cpu的核数信息,可根据实际情况进行配置
适用场景:适合案例比较多,机器比较充足,对整体耗时有一定要求的场景
三、对测试案例的要求
分布式测试要求案例之间相互独立,没有先后顺序,不互相依赖
即随意打乱顺序不影响最终结果
四、使用体会
pytest-xdist在开启线程时会需要一定的时间去开启进程,几个进程就会标记有几个【gw0】...【gwn】
针对案例较少的应用,使用多线程/多进程倒不如使用普通模式更省时间
所以要针对具体情况选择适合的分布式测试场景