我的pytest测试文件分布在多个软件包中,它们共享一些通用的固定装置。但是,我发现我的自动使用的会话范围内的夹具已运行了多次。
这是我项目的基本结构:
.
├── Pipfile
├── Pipfile.lock
├── __init__.py
├── common
│ ├── __init__.py
│ └── conftest.py
├── pkg_a
│ ├── __init__.py
│ ├── conftest.py
│ └── test_a.py
└── pkg_b
├── __init__.py
├── conftest.py
└── test_b.py
这是每个.py
文件的内容:
==> ./__init__.py <==
==> ./common/__init__.py <==
==> ./common/conftest.py <==
import pytest
@pytest.fixture(scope='session', autouse=True)
def setup():
print 'setting up'
yield
print 'tearing down'
==> ./pkg_a/__init__.py <==
==> ./pkg_a/conftest.py <==
from common.conftest import *
==> ./pkg_a/test_a.py <==
def test():
assert True
==> ./pkg_b/__init__.py <==
==> ./pkg_b/conftest.py <==
from common.conftest import *
==> ./pkg_b/test_b.py <==
def test_b():
assert True
这是pytest的输出:
➜ pytest -s pkg_a pkg_b
========================== test session starts ==========================
platform darwin -- Python 2.7.15, pytest-3.10.0, py-1.7.0, pluggy-0.8.0
rootdir: /path/to/the/project, inifile:
collected 2 items
pkg_a/test_a.py setting up
.
pkg_b/test_b.py setting up
.tearing down
tearing down
======================= 2 passed in 0.02 seconds ========================
我对会话固定装置的理解是,它们在pytest
命令的整个生命周期内只能运行一次。但是在这里setting up
和tearing down
被打印了两次,并且被交错了。
有什么方法只能执行一次夹具吗?我希望在整个测试过程中,setting up
仅在开始时打印一次,而tearing down
在最后一次打印结束。
P.S。我知道参数化会话固定装置将执行多次。但是我不认为我的灯具参数化。
答案 0 :(得分:0)
你是对的。会话作用域的夹具应该只运行一次。但是,如果仔细观察,会发现有两个用于test_a的安装程序。一个来自common / conftest.py,另一个来自pkg_a / conftest.py。您无需在pkg_a / conftest.py中导入common.conftest.py。 pytest从项目根目录开始收集conftest文件。
您可以通过--setup-show
开关:pytest test_a.py --setup-show
来查看灯具的设置过程。
要解决您的问题,您可以从test_a(b)/conftest.py文件中删除from common.conftest import *
。
更多有关pytest的conftest集合的信息:https://docs.pytest.org/en/2.7.3/plugins.html