gpt4 book ai didi

python - pytest:防止导入的自动使用的 session 装置多次执行

转载 作者:行者123 更新时间:2023-11-28 20:49:23 27 4
gpt4 key购买 nike

我的 pytest 测试文件分布在多个包中,它们共享一些共同的装置。但是,我发现我的自动使用的 session 范围的 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 ========================

我对 session 装置的理解是它们在 pytest 命令的生命周期内只会运行一次。但是这里setting uptealling down打印了两次,而且是交错的。

有没有办法只执行一次 fixture ?我希望 setting up 只在开始时打印一次,而 tealling down 在整个测试 session 的最后。

附言我知道参数化 session fixture 将执行多次。但我认为我的 fixture 没有参数化。

最佳答案

你是对的。 session 范围的 fixture 应该只运行一次。但是如果你仔细观察,test_a 有两个安装 fixture 。一个来自 common/conftest.py,另一个来自 pkg_a/conftest.py。您不需要在 pkg_a/conftest.py 中导入 common.conftest.py。 pytest 从项目根目录开始收集 conftest 文件。您可以使用 --setup-show 开关查看 fixture 设置过程: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

关于python - pytest:防止导入的自动使用的 session 装置多次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com