Pytest: как обойти отсутствие __init__.py в папке тестов? - PullRequest
0 голосов
/ 11 июня 2018

Я храню все файлы pytest в подкаталоге tests в корневом каталоге проекта.В этом каталоге или выше нет __init__.py, а pytest tests/test_a.py работает как положено.Я также могу запустить pytest test_a.py прямо из папки tests.

|--<project_root>
+---[tests]
    test_a.py
    base.py
    config.py
    conftest.py

Тестовый класс в test_a.py наследуется от base.py.Теперь проблема в том, что из-за отсутствия __init__.py инструментальная среда IDE не работает и импорт не может быть разрешен.Добавление __init__.py в tests устраняет все ошибки импорта в IDE, но тесты больше не запускаются с pytest test_a.py, поскольку py.test не может импортировать conftest.py.

В моем conftest.pyУ меня есть следующий импорт:

from config import HOST_URL_DEFAULT, USER, PASSWORD

, что приводит к:

ModuleNotFoundError: No module named 'config'
ERROR: could not load /project_root/tests/conftest.py

Есть ли способ решить эту проблему, чтобы оба инструмента IDE работали и pytest продолжает работать?Я хотел бы избежать использования точечного импорта, если это возможно.

Обновление: После прочтения этот ответ Я думаю, что, наконец, начинаю понимать немного большекак работает импорт python.

1 Ответ

0 голосов
/ 11 июня 2018

Добавьте __init__.py и используйте относительный или абсолютный импорт в conftest.py:

# relative
from .config import HOST_URL_DEFAULT, USER, PASSWORD
# absolute
from tests.config import HOST_URL_DEFAULT, USER, PASSWORD

В пакете (обозначенном __init__.py) вам нужны однозначные пути импорта.Использование неквалифицированного импорта (from config import ...) зависит от PYTHONPATH или sys.modules, включая корень вашего пакета - это обычно не надежно и его следует избегать, поскольку оно обходит инфраструктуру пакета.

Что у вас есть (config.py используется другими модулями) - это пакет.Рассматривайте это как единое целое.


pytest не не препятствует использованию тестового пакета с __init__.py!Для этого есть реальные варианты использования - например, ваш.

Что pytest не поощряет имеет исходный пакет и тестовый пакет в том же корневом каталоге источника.Однако это означает, что вам следует переместить исходный пакет , а не тестовый пакет!

mysource/  # root directory for both mypackage and mytests
+- mypackage/  # should be src/mypackage instead!
   +- __init__.py
   +- abcd.py
+- mytests
   +- __init__.py
   +- tests_abcd.py  # ``from mypackage import abcd`` imports from source

Проблема в том, что запуск mytests означает, что mypackage также можно импортировать из источника,То есть ваши тесты работают на вашем исходном пакете , а не на вашем установленном пакете.Если в вашей процедуре установки есть какие-либо ошибки, тестирование ее не отловит. Подробнее см. В блоге, связанном в pytest документах .

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