pytest--xdist分布式运行

发布时间 2023-03-27 18:07:45作者: 测试-13

前言

当测试用例数量上去以后,执行一遍所有测试用例,那么执行速度就会比较慢,除了多线程来提高效率外,pytest也提供pytest-xdist插件来做分布式执行,从而减少测试时间,它属于进程级别的并发

 

pytest-xidst安装

可以直接通过pip进行安装

pip install pytest-xdist

如果一直下载失败,推荐使用国内镜像源下载

pip install pytest-xdist -i http://pypi.douban.com/simple/

分布式测试用例的设计原则:
1、独立运行:用例之间互相独立,并且没有依赖关系,还可以完全独立运行
2、随机执行,用例执行不强制按顺序执行,支持顺序执行或随机执行
3、不影响其他用例:每个用例都能重复运行,运行结果不会影响其他用例

 

使用方法

1、设置运行cpu核数

pytest -n x

-n x:n:设置cpu核数参数 ,x:cpu核数个数(也可以设置auto,表示使用所有cpu核数运行,但此运行方式cpu使用率会占用很高)

直接上例子,对比运行时间能够提升多少

import time


def test_01():
    time.sleep(2)
    print('用例一执行')

def test_02():
    time.sleep(2)
    print('用例二执行')

def test_03():
    time.sleep(2)
    print('用例三执行')

def test_04():
    time.sleep(2)
    print('用例四执行')

pytest test_xdist.py -sv输出结果:

 

 单进程4个测试用例执行时间为8.07s

 

那么接下来使用pytest test_xdist.py -n auto输出结果:

 

 gw0、1、2、3表示用例执行的进程编号,这表示4个测试用分别在4个子进程中并行运行,性能为4.92s,可以看到远比单进程运行要效率很多,快整整3s左右

 

2、调试代码

pytest-xdist插件也提供--looponfail参数来帮助调试测试用例的代码,它会自动监视代码的修改。当执行到错误用例时,它会停住,并打印出错误用例和错误代码行数,等待你修改代码完毕后,会单独运行这个错误用例,如果错误用例执行通过后,会再次运行所有测试用例。所有用例都测试通过后,需要手动ctrl+c退出

示例代码:

import time


def test_01():
    time.sleep(2)
    print('用例一执行')

def test_02():
    time.sleep(2)
    print('用例二执行')

def test_03():
    time.sleep(2)
    assert 1 == 2 
    print('用例三执行')

def test_04():
    time.sleep(2)
    print('用例四执行')

cmd窗口当前路径下执行pytest test_xdist.py -sv --looponfail,输出结果如下:

 

 出现waiting for changes就表示执行已经暂停住,这时候就可以对代码内容进行修改,这里报错提示test_03的断言错误,那么将assert 1 == 2 改为正确的 assert 2 == 2。当你修改完成后,重新回到cmd窗口才会开始执行,所以并不需要那么急地修改代码,pytest监测到代码内容已经更改,就会继续执行,将fail的测试用例重新运行,运行通过后,再将所有测试用例执行

 

 

总结

pytest-xdist插件帮助我们大大提高了测试用例执行效率,也提供更方便的代码调试参数,是一个功能十分强大的pytest的插件