pytest:防止导入的自动使用的会话装置执行多次

时间:2018-11-21 15:45:18

标签: python testing pytest fixtures

我的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 uptearing down被打印了两次,并且被交错了。

有什么方法只能执行一次夹具吗?我希望在整个测试过程中,setting up仅在开始时打印一次,而tearing down在最后一次打印结束。

P.S。我知道参数化会话固定装置将执行多次。但是我不认为我的灯具参数化。

1 个答案:

答案 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