pytest рекомендует , включая дополнительный каталог для разделения исходного кода в проекте:
my_package
├── src # <-- no __init__.py on this layer
│ └── my_package
│ ├── __init__.py
│ └── util_module
│ ├── __init__.py
│ └── utils.py
└── tests
├── __init__.py
└── test_util_module
├── __init__.py
└── test_utils.py
К сожалению, они ничего не говорят 1 о том, как импорт в тестовом коде должен работать в таком случае, который прекрасно работает для моей IDE в этом наивном примере 2 , но вызывает следующую ошибку с pytest:
my_package $ pytest
====================== test session starts ======================
platform linux -- Python 3.6.4, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: /home/user/workspace/my_package, inifile:
collected 0 items / 1 errors
============================ ERRORS =============================
___ ERROR collecting tests/test_util_module/test_utils.py ___
ImportError while importing test module '/home/user/workspace/my_package/tests/test_util_module/test_utils.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_util_module/test_utils.py:1: in <module>
from test.test_module.some_file import starify
E ModuleNotFoundError: No module named 'my_package.util_module'
!!!! Interrupted: 1 errors during collection !!!!!
Я могу решить эту проблему, изменив импорт теста на from src.my_package.util_module.utils import starify
, но затем мои жалобы IDE на то, что часть src
является избыточной, поэтому я бы хотел ее не использовать.
1: Дело уже не в этом. Начиная с версии 3.7.3, pytest рекомендует редактируемую установку, также представленную в ответе @ hoefling в верхней части рекомендаций .
2: настройка virtualenv env -p python3.6; source env/bin/activate; pip install pytest