Я пытаюсь использовать pytest для запуска тестов в двух разных плагинах, расположенных в следующей структуре папок:
Структура папок
src/some_package
└── plugin1
│ └── plugin1
│ └── tests
│ │ └──__init__.py
│ │ └── unit
│ │ │ └──__init__.py
│ │ │ └──conftest.py
│ │ │ └──test_plugin1.py
└── plugin2
│ └── plugin2
│ └── tests
│ │ └──__init__.py
│ │ └── unit
│ │ │ └──__init__.py
│ │ │ └──conftest.py
│ │ │ └──test_plugin2.py
Я настраиваю параметры запуска pytest с помощью pyproject.toml
, поскольку есть и другие настройки.
pyproject.toml
[tool.pytest.ini_options]
markers = [
"unittest: marks tests as unittest",
"unittest-slow: marks tests as unittest that takes a long time",
]
Когда я пытаюсь бежать poetry run pytest -v -m unittest
, я получаю
E _pytest.pathlib.ImportPathMismatchError: ('tests.unit.conftest', 'src/some_package/plugin1/tests/unit/conftest.py', PosixPath('src/some_package/plugin2/tests/unit/conftest.py'))
Возможное решение 1.
Если я добавлю addopts = "--import-mode=importlib"
к аргументам pytest в pyproject.toml
, я получу
E ValueError: Plugin already registered under a different name: src/some_package/plugin1/tests/unit/conftest.py=<module 'tests.unit.conftest' from 'src/some_package/plugin2/tests/unit/conftest.py'>
Возможное решение 2.
Ни одна из ошибок не исчезает при использовании
testpaths = ["src/some_package/plugin2/tests", "src/some_package/plugin1/tests"]
или pythonpath = "src/some_package/plugin1:src/some_package/plugin2"
Примечание. Это работает, если я запускаю тесты индивидуально.
poetry run pytest -v -m unittest src/some_package/plugin2/tests
Есть ли какое-либо решение этой проблемы, чтобы я мог продолжать использовать pyproject.toml?
Этого можно избежать, переименовав папку тестов в плагине в tests_plugin1
, tests_plugin2
. В моем случае это особенно проблема, потому что у меня есть путь к каждому плагину (src/some_package/plugin1
) в PYTHONPATH.