pytest-xdist 分布式执行用例

Posted qika

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest-xdist 分布式执行用例相关的知识,希望对你有一定的参考价值。

pytest-xdist是属于进程级的并发运行


一般写用例尽量要遵循的规则:
用例之间没有依赖关系,用例可以独立运行的
用例可随机运行
每个用例都能重复运行,运行结果不影响其他用例


分布式执行用例:
直接执行:pytest -s
自动检测到系统的CPU核数来分布式执行:pytest -s -n auto
指定本机cpu数量来运行:pytest -s -n 2

 

报告:
分布式执行用例 pytest-xdist,结合使用pytest-html
pytest -s -n auto --html=report.html --self-contained-html

 

 

另:-------------------------------------------------------

管理用例执行顺序:    pytest-xdist默认是无序执行的,可以通过 --dist 参数来控制顺序 :

--dist=loadscope
将按照同一个module下的函数、同一个测试类class下的方法来分组,
然后将每个组发给可以执行的进程里去,同一组的测试用例在同一个进程中执行
注意:目前无法自定义分组,因此按类class分组 优先于 按模块module分组 执行


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

 

 

 


存在有一个问题:
如以下目录:

conftest.py   #写了预置 login 在内
test_1.py
__init__.py
    #二级目录
    conftest.py
    test_2.py
     __init__.py

使用pytest-xdist分布式运行测试用例,每个进程里面都是互相独立运行被分到同一组的用例
那么就会存在一种情况:
假设现在每条case都需要登录之后才能执行,但是因为进程是独立运行被分到同一组的用例,
但是登录login这个预置条件又会有很多个进程都会调用
-->>这里就会涉及到被fixture装饰的login方法会被请求调用多次
-->>(但是fixture的用处就是避免重复请求运行,这里就有点冲突了)

 

实现只调用一次方法:
(就算用例分组到不同进程内,分布式运行用例时也只调用一次被fixture的login)
当第一次请求这个fixture时,则使用with方法,利用FileLock仅产生一次fixture数据
当其他进程再次请求这个fixture时,则会从文件中读取数据

import pytest
from filelock import FileLock

@pytest.fixture(scope="session")
def login():
    print("登录成功后返回user 和token")
    with FileLock("session_lock"):
        user = "admin"
        token = "TYUW12ewesdfsdfdsf3123dese"
    yield name, token
    print("退出登录")        

 

以上是关于pytest-xdist 分布式执行用例的主要内容,如果未能解决你的问题,请参考以下文章

46-pytest-分布式插件pytest-xdist使用

Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)

pytest-27-pytest分布式执行(pytest-xdist)

pytest文档27-pytest分布式执行(pytest-xdist)

python自动化web自动化:7.测试框架实战三之并发执行用例

pytest学习系列_插件之分布式执行