我的pytest测试文件分布在多个包中,它们共享一些公共的fixture。但是,我发现我的自动使用的会话作用域fixture被多次运行。
以下是我的项目的基本结构:
.
├── 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 ========================我对会话fixture的理解是,在pytest命令的生命周期内,它们只会运行一次。但是在这里,setting up和tearing down被打印了两次,并且它们是交错的。
有没有办法只执行一次fixture?我希望在整个测试会话开始时只打印一次setting up,在最后打印一次tearing down。
附注:我知道参数化的会话fixture将被多次执行。但我不认为我的fixture是参数化的。
发布于 2018-11-22 02:00:42
你是正确的。会话作用域的fixture应该只运行一次。但是如果仔细观察,就会发现test_a有两个安装fixture,一个来自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
https://stackoverflow.com/questions/53415697
复制相似问题