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("退出登录")        

 

posted on 2020-07-08 21:53  QiKa  阅读(675)  评论(0编辑  收藏  举报