Выполняется py.test в каталоге repo, и все работает так, как вы ожидали.
Но когда я пробую то же самое в Linux или Windows (в обоих есть pytest 2.2.3), он лает всякий раз, когда попадает на первый импорт чего-либо из моего пути к приложению. Например, from app import some_def_in_app.
Нужно ли мне редактировать свой PATH для запуска py.test в этих системах?
Переведено автоматически
Ответ 1
Я не уверен, почему py.test не добавляет текущий каталог в сам PYTHONPATH, но вот обходной путь (который выполняется из корня вашего репозитория):
python -m pytest tests/
Это работает, потому что Python добавляет текущий каталог в PYTHONPATH для вас.
Ответ 2
Рекомендуемый подход для pytest>=7: используйте параметр pythonpath
Недавно pytest был добавлен новый плагин core, который поддерживает sys.path модификации с помощью pythonpath значения конфигурации. Таким образом, решение теперь намного проще и больше не требует обходных путей:
pyproject.toml пример:
[tool.pytest.ini_options] pythonpath = [ "." ]
pytest.ini пример:
[pytest] pythonpath = .
Записи пути вычисляются относительно rootdir, таким образом, в этом случае . добавляется repo каталог к sys.path.
Также допускается несколько записей пути: для макета
Original answer (not recommended for recent pytest versions; use for pytest<7 only): conftest solution
The least invasive solution is adding an empty file named conftest.py in the repo/ directory:
$ touch repo/conftest.py
That's it. No need to write custom code for mangling the sys.path or remember to drag PYTHONPATH along, or placing __init__.py into dirs where it doesn't belong (using python -m pytest as suggested in Apteryx's answer is a good solution though!).
pytest looks for the conftest modules on test collection to gather custom hooks and fixtures, and in order to import the custom objects from them, pytest adds the parent directory of the conftest.py to the sys.path (in this case the repo directory).
Other project structures
If you have other project structure, place the conftest.py in the package root dir (the one that contains packages but is not a package itself, so does not contain an __init__.py), for example:
beware that adding src to PYTHONPATH mitigates the meaning and benefits of the src layout! You will end up with testing the code from repository and not the installed package. If you need to do it, maybe you don't need the src dir at all.
Where to go from here
Of course, conftest modules are not just some files to help the source code discovery; it's where all the project-specific enhancements of the pytest framework and the customization of your test suite happen. pytest has a lot of information on conftest modules scattered throughout their docs; start with conftest.py: local per-directory plugins