gpt4 book ai didi

python - 为什么 pytest 在仅运行一部分测试时不加载 conftest.py?

转载 作者:行者123 更新时间:2023-12-04 12:32:34 24 4
gpt4 key购买 nike

这是我的 API 测试目录布局:

api_tests
├── conftest.py
└── query
└── me_test.py
conftest.py 的内容:
print("CONFTEST LOADED")
me_test.py 的内容:
"""Tests the "me" query"""

def test_me():
assert True
如果我只是运行 pytest ,一切正常:
================================================= test session starts =================================================
platform linux -- Python 3.8.5, pytest-6.1.0, py-1.9.0, pluggy-0.13.1
rootdir: /home/hubro/myproject, configfile: pytest.ini
collecting ... CONFTEST LOADED
collected 3 items

api_tests/query/me_test.py . [ 33%]
lib/myproject/utils_test.py . [ 66%]
lib/myproject/schema/types/scalars_test.py .
注意打印“CONFTEST LOADED”。伟大的!但是,此测试运行还选取了我不想要的所有单元测试。我想将我的测试运行分为单元测试和 API 测试,我不想一次性运行它们。
但是,如果我只是运行 pytest api_tests/ :
================================================= test session starts =================================================
platform linux -- Python 3.8.5, pytest-6.1.0, py-1.9.0, pluggy-0.13.1
rootdir: /home/hubro/myproject, configfile: pytest.ini
collected 1 item

api_tests/query/me_test.py . [100%]

================================================== 1 passed in 0.00s ==================================================
现在运行了正确的测试,但是没有加载 conftest.py 文件......怎么会?

我在 Python 3.8 上使用 Pytest 6.1.0。

编辑:好的,我找到了一个可以接受的解决方法。我可以通过命令行使用 -o 覆盖 INI 文件选项。选项。这有效:
poetry run pytest -o "testpaths=api_tests"
但是,我非常想要原始问题的答案,因此我不会将其删除。

最佳答案

conftest插件将在两次调用中注册,唯一的区别是注册阶段。如果有疑问,请添加 --traceconfig按注册顺序列出已注册插件的参数:

$ pytest --traceconfig
PLUGIN registered: <_pytest.config.PytestPluginManager object at 0x7f23033ff100>
PLUGIN registered: <_pytest.config.Config object at 0x7f2302d184c0>
...
=================================== test session starts ===================================
...
PLUGIN registered: <module 'conftest' from 'path/to/conftest.py'>
...
在第一次调用中, conftest.py不会立即被找到,因为它在测试根路径下,所以它会在 pytest 被加载发现测试。在第二次调用中, conftest.py位于测试根目录中,因此它甚至会在测试 session 开始之前加载(在加载通过 -p arg 传递并通过 setuptools 入口点注册的插件之后)。运行 pytest -s (禁用输出捕获)应该显示自定义打印,位于 ==== test session starts ==== 上方线。
如果您希望两次调用之间的打印相同,请将其放在合适的 Hook 中。例如,要始终打印 CONFTEST loaded测试收集完成后,使用:
# api_tests/conftest.py

def pytest_collectreport(report):
print("CONFTEST loaded")
还有其他选项可用于自定义输出放置;最好是查看 Hooks 下的可用钩子(Hook)列表在 pytest引用。

关于python - 为什么 pytest 在仅运行一部分测试时不加载 conftest.py?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64233121/

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