aamt工具:pytest-xdist分布式执行用例及合并Allure报告

分布式执行用例

借助于pytest-xdist,在命令行执行时添加参数-n auto

pytest -n auto

pytest-xdist会自动根据本地机器硬件配置,设置最优并发,并分发用例,分布式执行。

当然 也可以自主设置进程数量 ,比如

pytest -n 3
# 或者 
pytest -n 4

测试方法:

  1. 运行框架里面的 main.py

image-20230202184012921

  1. 设定用例的采集路径。这里只采集 main.py 生成的用例文件

    image-20230202184352430

执行用例,

  1. 第一次串行,执行以下命令

    pytest --aamt-reports
    
  2. 第二次xdist并行,执行以下命令

    pytest -n auto --aamt-reports
    

image-20230202185346511

执行时间从50s一下降到4s,性能提升还是非常的明显

合并Allure报告

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

image-20230202185914378

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

http://biji.51automate.cn/blogs/img/20230202185949.png

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复用问题? 会有专门介绍