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】

  针对案例较少的应用,使用多线程/多进程倒不如使用普通模式更省时间

  所以要针对具体情况选择适合的分布式测试场景

  

 

posted @ 2022-10-13 10:36  千鱼千寻  阅读(394)  评论(0编辑  收藏  举报