aamt工具:pytest-xdist分布式执行用例及合并Allure报告
分布式执行用例
借助于pytest-xdist,在命令行执行时添加参数-n auto:
pytest -n auto
pytest-xdist会自动根据本地机器硬件配置,设置最优并发,并分发用例,分布式执行。
当然 也可以自主设置进程数量 ,比如
pytest -n 3
# 或者
pytest -n 4
测试方法:
运行框架里面的
main.py

设定用例的采集路径。这里只采集
main.py生成的用例文件
执行用例,
第一次串行,执行以下命令
pytest --aamt-reports
第二次xdist并行,执行以下命令
pytest -n auto --aamt-reports

执行时间从50s一下降到4s,性能提升还是非常的明显
合并Allure报告
pytest-xdist分布式执行,只要把allure源文件,也就是那一堆json文件,存到同一个目录下,报告的数据就是一体的,不需要单独合并。但是有个问题,aamt封装了--aamt-reports 命令行参数一键生成Allure报告,背后的逻辑是在pytest_sessionfinish hook函数里面实现的,分布式执行时,每个xdist的node都是一个单独的session,多个node就会生成多份报告:

10个node(节点)生成了11份报告,其中1份master节点生成的。pytest-xdist的原理如图所示:

master节点不运行任何测试,只是通过一小部分消息与节点通信。子节点执行后会通过workeroutput把数据回传给master节点。所以只需要通过是否有workeroutput属性来判断master节点:
def _is_master(config):
"""
pytest-xdist分布式执行时,判断是主节点master还是子节点
主节点没有workerinput属性
"""
return not hasattr(config, 'workerinput')
然后只在主节点的pytest_sessionfinish,生成1次报告,就能避免生成多份报告。这样在xdist分布式执行模式下,--aamp-reports也只会生成1份合并后的包含所有测试用例的Allure HTML报告。
源码实现:
感谢刚哥,给的建议,
为了能够持续集成,做了这里做了一点点优化。
实际使用过程中, 分布式环境下执行用例,如何有效解决token复用问题? 会有专门介绍