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