我的项目中的 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
来解决问题。这适用于单个测试运行,但在使用 CLI 命令(如 pytest .
)运行所有测试时会导致错误,并出现以下错误:
```
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
按钮对经验不足的非技术团队成员起作用。
所以我的问题是:
其他背景:
提前感谢您的帮助!
在运行配置中尝试更改工作目录。默认情况下,它是测试文件位置。当您从控制台运行它时,工作目录是存储库的根目录,因此它可以在查找模块时找到所需的装置。
此外,您可以尝试切换一些选项,例如
Add content roots to PYTHONPATH
和 Add source root to PYTHONPATH
。
基本上,如果您可以毫无问题地从控制台运行它,则仅意味着 Pycharm 正在与路径作斗争。