Pytest提供了丰富的插件来扩展其功能,本章介绍下插件pytest-xdist,主要是提供并行测试、分布式测试、循环测试等功能,可以加快测试速度。
pytest-xdist官方显示没有严格的python和pytest版本限制。
pytest-xdist安装
使用pip命令安装: pip install pytest-xdist (安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看pycharm配置pytest运行环境)
通过pycharm安装:打开设置,按照如下图中安装插件(windows系统)
pytest-xdist运行
执行时添加参数-n
- 指定执行的并发数:-n 4,表示4个并发
- 自动检测 CPU 的核心数并启动相应数量的进程,可以使用:-n auto
举例:测试文件有18个测试用例,每个测试用例通过time.sleep(1)沉睡1s
1)不填加-n参数执行
我们通过cmd窗口执行用例:
pytest.exe -v C:/Users/wsybb520/PycharmProjects/pytestProject2/test_dir1/test_case3.py
执行后结果显示18s完成
- 添加参数-n auto通过多进程执行
pytest.exe -v -n auto C:/Users/wsybb520/PycharmProjects/pytestProject2/test_dir1/test_case3.py
执行结果如下图,显示4个workers 执行18个用例,用时7.27s,但是用例执行顺序也会被打乱。
通过以上示例可以看出并发执行会减少执行时间,提升测试效率,尤其用例很多的时候更加明显。
配合pytest-html插件生成测试报告,测试报告打开如下
pytest.exe -v -n auto --html=report.html C:/Users/wsybb520/PycharmProjects/pytestProject2/test_dir1/test_case3.py
执行时添加参数--dist
--dist参数用于控制测试用例的执行顺序和分组方式。
l --dist=load (默认) :将待处理的测试发送给任何可用的工作器,不保证任何顺序。
l --dist=loadscope:按照模块(module)和测试类(class)来分组,确保同一个组的测试用例在同一进程中执行。
l --dist=loadfile:按照文件名来分组,确保同一个文件中的测试用例在同一进程中执行。
l --dist=loadgroup:按照 xdist_group 标记分组。之前我们文章介绍使用@pytest.mark可自定义标记,此时使用@pytest.mark.xdist_group做标记,被标记的将分在同一个执行器执行。
举例:添加参数--dist=loadscope
测试文件函数级测试用例5个,测试类中测试用例18个,每个测试用例都使用time.sleep(1)沉睡1s,
预期结果:使用2个进程,添加参数时,因为测试类级用例要分在一个执行器中,整体大于18s;如果不带参数23条用例耗时肯定小于18s,在13s左右。
我们看结果:
添加执行参数--dist=loadscope,耗时时19.9s
不添加参数,耗时是13.7s
举例:添加参数--dist=loadgroup
测试文件函数级测试用例5个,测试类中测试用例18个,每个测试用例都使用time.sleep(1)沉睡1s,
预期结果使用2个进程,添加参数时,因为测试类级用例要分在一个执行器中,整体大于18s;如果不带参数23条用例耗时肯定小于18s,在13s左右。
我们看结果:
添加执行参数--dist=loadgroup,耗时时19.77s
pytest.exe -v -n 2 --dist=loadgroup --html=report/report.html C:/Users/wsybb520/PycharmProjects/pytestProject2/test_dir1/test_case6.py
不添加参数,耗时是13.61s
使用注意事项
因为多进程执行并且用例执行顺序会被打乱,因此大家使用时需要注意以下项目。
测试用例独立性:由于 pytest-xdist 并行执行测试用例,测试用例之间的顺序是不确定的。因此,如果测试用例之间需要共享数据或进行某种形式的同步操作,需要确保在使用 pytest-xdist 时正确处理这些情况。
并发和资源问题:并行执行测试用例可能会引发并发问题,如资源竞争、死锁,可能会占用大量的计算资源和内存。在设计测试用例时,要特别注意并发问题,并采取适当的措施来避免或解决这些问题。
共勉: 东汉·班固《汉书·枚乘传》:"泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。"
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。
---祝愿大家都能够龙腾虎跃,步步高升!!!