从 PyCharm IDE 运行测试时未找到 Pytest 夹具

问题描述 投票:0回答:1

我的项目中的 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
按钮对经验不足的非技术团队成员起作用。

所以我的问题是:

  1. 是否有人遇到过这样的问题:PyCharm 在运行单个测试时无法从根 conftest.py 找到固定装置,但 pytest 在从命令行运行时可以?
  2. 如何解决此问题,以便 PyCharm 的运行按钮和命令行 pytest 一致工作?

其他背景

  • Pytest版本:pytest 7.4.4
  • PyCharm 版本:2023.2.1
  • Python版本:3.9.6

提前感谢您的帮助!

python pycharm pytest python-decorators pytest-fixtures
1个回答
0
投票

在运行配置中尝试更改工作目录。默认情况下,它是测试文件位置。当您从控制台运行它时,工作目录是存储库的根目录,因此它可以在查找模块时找到所需的装置。

此外,您可以尝试切换一些选项,例如

Add content roots to PYTHONPATH
Add source root to PYTHONPATH

基本上,如果您可以毫无问题地从控制台运行它,则仅意味着 Pycharm 正在与路径作斗争。

© www.soinside.com 2019 - 2024. All rights reserved.