我的项目中的 pytest 装置遇到问题。我有一个根
conftest.py
文件,其中包含一些通用固定装置和用于特定测试的隔离
conftest.py
文件。文件夹结构如下:
product-testing/
├── conftest.py # Root conftest.py
├── tests/
│ └── grpc_tests/
│ └── collections/
│ └── test_collections.py
└── fixtures/
└── collections/
└── conftest.py # Used by test_collections.py specifically
当我尝试使用测试函数附近的“运行按钮”从 IDE (PyCharm) 运行测试时,pytest 无法从根目录初始化装置
conftest.py
测试代码是这样的:
import datetime
import allure
from faker import Faker
from fixtures.collections.conftest import collection
fake = Faker()
@allure.title("Get list of collections")
def test_get_collections_list(collection, postgres):
with allure.step("Send request to get the collection"):
response = collection.collection_list(
limit=1,
offset=0,
# ...And the rest of the code
)
这是来自
fixtures/collection/
import datetime
import pytest
from faker import Faker
from path.to.file import pim_collections_pb2
fake = Faker()
@pytest.fixture(scope="session")
def collection(grpc_pages):
def create_collection(collection_id=None, store_name=None, items_ids=None, **kwargs):
default_params = {
"id": collection_id,
"store_name": store_name,
"item_ids": items_ids,
"is_active": True,
"description_eng": fake.text(),
# rest of the code
的竞赛,这是根
conftest.py
文件
import pytest
from faker import Faker
from pages.manager import DBManager, GrpcPages, RestPages
fake = Faker()
@pytest.fixture(scope="session")
def grpc_pages():
return GrpcPages()
@pytest.fixture(scope="session")
def rest_pages():
return RestPages()
@pytest.fixture(scope="session")
def postgres():
return DBManager()
#some other code
我得到的错误消息是:
test setup failed
file .../tests/grpc_tests/collections/test_collections.py, line 9
@allure.title("Create a multi-collection")
def test_create_multicollection(collection, postgres):
file .../fixtures/collections/conftest.py, line 10
@pytest.fixture(scope="session")
def collection(grpc_pages):
E fixture 'grpc_pages' not found
> available fixtures: *session*faker, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, collection, doctest_namespace, factoryboy_request, faker, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
> use 'pytest --fixtures [testpath]' for help on them.
但是,当我通过终端用
pytest .
,没有错误。似乎 pytest 在一种情况下可以看到根
conftest.py
,但在另一种情况下却看不到。
我尝试直接从根
conftest.py
显式导入缺失的装置来解决该问题。这适用于单个测试运行,但在使用像
pytest .
这样的 CLI 命令运行所有测试时会导致错误,并出现以下错误:
```
ImportError while importing test module '/path/to/test_collections.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../importlib/init.py:127: in import_module
return bootstrap.gcd_import(name[level:], package, level)
tests/.../test_collections.py:6: in <module>
from conftest import grpc_pages
E ImportError: cannot import name 'grpc_pages' from 'conftest' (/path/to/fixtures/users/conftest.py)
```
感觉 pytest 正在尝试在隔离的
grpc_pages
而不是根目录中查找
conftest.py
文件。
此外,当导入不明确时,可以通过像
-
pytest -k "test_create_multicollection" ./tests/grpc_tests/collections/
-
pytest path/to/test_collections.py::test_create_multicollection
这样的命令运行隔离测试。但是,我需要让 IDE 中的
run
按钮为经验不足的非技术团队成员工作。
所以我的问题是:
- 是否有人遇到过 PyCharm 无法从root conftest.py 运行单个测试时,但 pytest 可以从命令行运行?
- 如何修复此问题,以便 PyCharm 的运行按钮和命令行 pytest 一致工作?
其他上下文 :
- Pytest 版本:pytest 7.4.4
- PyCharm 版本:2023.2.1
- Python 版本:3.9.6
提前感谢您的帮助!
问题出在 PyCharm 如何创建测试运行配置,而不是 pytest 本身。当你使用 PyCharm 中测试函数旁边的“运行”按钮时,它会创建一个使用测试文件所在的目录作为测试根目录的运行配置。这意味着 pytest 只会搜索该目录及其子目录中的 conftest.py 文件,而不会搜索你的项目根目录。
你可以通过两种方法解决这个问题:
方法 1:修改运行配置
- 像往常一样点击测试函数旁边的“运行”按钮。
- 在出现的运行配置窗口中,找到“测试”部分。
- 将“目标”字段从文件名改为项目根目录。你可以使用“...”按钮进行浏览。
- 勾选“使用 pytest 选项运行配置”选项。
- 点击“应用”保存更改。
现在,当你使用这个运行配置时,pytest 将会从你的项目根目录开始搜索,从而找到根 conftest.py 文件中的 fixtures。
方法 2:修改 PyCharm 默认测试运行配置
- 打开 PyCharm 的设置(File > Settings 或 Ctrl+Alt+S)。
- 导航到“工具”>“Python 集成工具”>“测试”。
- 选择“pytest”。
- 勾选“默认使用 pytest 选项运行配置”。
-
在“默认测试运行器选项”字段中添加
--rootdir=
并将你的项目根目录路径粘贴在后面。 - 点击“应用”保存更改。
这样一来,所有新创建的 pytest 运行配置都会默认使用项目根目录作为测试根目录,并且你不再需要为每个测试单独修改配置。
额外建议:
为了更清晰地组织你的测试代码,你可以考虑删除子目录中的
conftest.py
文件,并将所有 fixtures 集中到项目根目录下的
conftest.py
文件中。这可以避免 pytest 搜索路径的混乱,并使你的代码更易于维护。
如果你确实需要在子目录中定义 fixtures,请确保它们不会与根 conftest.py 文件中的 fixtures 发生名称冲突,并考虑使用更明确的命名来区分它们,例如使用模块名作为前缀。
标签:python,pycharm,pytest,python-decorators,pytest-fixtures From: 78752644