Использование pytest со слоем src - PullRequest
0 голосов
/ 03 мая 2018

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

1 Ответ

0 голосов
/ 03 мая 2018

Настройка PYTHONPATH (как предлагается в комментариях) - это одна из возможностей решения проблемы импорта. Другой способ - добавить пустой файл conftest.py в каталог src:

$ touch src/conftest.py

и pytest добавят src к sys.path. Это простой способ обмануть pytest при добавлении кодовой базы к sys.path.

Однако макет src обычно выбирается, когда вы собираетесь построить дистрибутив, например, предоставление setup.py с (в данном случае) явным указанием директории корневого пакета:

from setuptools import find_packages, setup


setup(
    ...
    package_dir={'': 'src'},
    packages=find_packages(where='src'),
    ...
)

и установку пакета в режиме разработки (через python setup.py develop или pip install --editable .), пока вы все еще разрабатываете его. Таким образом, ваш пакет my_package правильно интегрирован в структуру пакетов сайта Python, и вам не нужно возиться с PYTHONPATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...