1、介绍

pytest-xdist,让自动化测试用例可以分布式执行,从而大大节省测试时间,pytest-xdist 是属于进程级别的并发。

分布式测试用例的设计原则:

(1)独立运行:用例之间是独立的,并且没有依赖关系,还可以完全独立运行。

(2)随机执行:用例执行不强制按顺序执行,支持顺序执行或随机执行。

(3)不影响其他用例:每个用例都能重复运行,运行结果不会影响其他用例。

2、使用分布式测试执行测试用例

参数 -n auto:可以自动检测到系统的CPU核数。

使用 auto 等于利用了所有CPU来跑用例,此时CPU占用率会特别高。

打开命令行,在该项目根目录下,输入执行命令

pytest -s -n auto

3、使用分布式测试执行测试用例(指定多少进程)

打开命令行,在该项目根目录下,输入执行命令

pytest -s -n 5

4、按照一定顺序执行

pytest-xdist 默认是无序执行的,可以通过 --dist 参数来控制执行顺序。

--dist=loadscope:

将按照同一个模块 module 下的函数和同一个测试类 class 下的方法来分组,然后将每个测试组发给可以执行的 worker,确保同一个组的测试用例在同一个进程中执行。目前无法自定义分组,按类 class 分组优先于按模块 module 分组。

--dist=loadfile:

按照同一个文件名来分组,然后将每个测试组发给可以执行的 worker,确保同一个组的测试用例在同一个进程中执行。

pytest.ini配置文件中的配置项

# -n=5 --dist=loadfile  多进程并行n=5,5个进程,按照py文件顺序执行,不同py之间并行运行
addopts = -vs -n=5 --dist=loadfile

5、使 scope=session 的 fixture 在 test session 中仅执行一次

pytest-xdist 是让每个 worker 进程执行属于自己的测试用例集下的所有测试用例。

这意味着在不同进程中,不同的测试用例可能会调用同一个 scope 范围级别较高(例如session)的 fixture,该 fixture 则会被执行多次,这不符合 scope=session 的预期。

尽管 pytest-xdist 没有内置的支持来确保会话范围的 fixture 仅执行一次,但是可以通过使用锁定文件进行进程间通信来实现。

示例:

(1)该示例只需要执行一次login(如只需要执行一次来定义配置选项等)。

(2)当第一次请求这个fixture时,则会利用FileLock仅产生一次fixture数据。需要安装filelock包,安装命令pip install filelock

(3)当其他进程再次请求这个fixture时,则会从文件中读取数据。

脚本代码:

import pytest
from filelock import FileLock

@pytest.fixture(scope="session")
def login():
    print("===登录,返回:name,token===")
    with FileLock("session.lock"):
        name = "AllTests"
        token = "123456qwe"   
   # Web App UI自动化,声明一个driver,再返回
    # 接口自动化,发起一个登录请求,将token返回
 
yield name, token
print("===退出===")