Pytest странный ImportError - PullRequest
       11

Pytest странный ImportError

0 голосов
/ 02 октября 2018

У меня странная проблема при запуске PyTest для моего проекта.Структура проекта выглядит примерно так.

myproject
├── env
│   └── stuff
├── __init__.py
├── myproject
│   ├── __init__.py
│   └── myfile.py
└── tests
    ├── __init__.py
    └── framework
        └── unit
            └── test_myfile.py

Код в myproject / myproject работает нормально. Кроме того, в корневом каталоге myproject есть папки с ссылочным кодом в myproject / myproject в виде модуля.

Но когда я запускаю pytest, используя следующий синтаксис (внутри virutalenv)

(env) myproject $ python3.6 -m pytest tests/framework

Все тесты завершаются неудачно со следующими сообщениями об ошибках:

E           ModuleNotFoundError: No module named 'myproject.tests'


E               _pytest.nodes.Collector.CollectError: ImportError while importing test module '/home/myuser/projects/myproject/tests/__init__.py'.
E               Hint: make sure your test modules/packages have valid Python names.
E               Traceback:
E               ModuleNotFoundError: No module named 'myproject.tests'

Вывод

(env) myproject $ python3.6 -c "import sys; print('\n'.join(sys.path))" 

- это

/home/myuser/projects/myproject/env/lib/python36.zip
/home/myuser/projects/myproject/env/lib/python3.6
/home/myuser/projects/myproject/env/lib/python3.6/lib-dynload
/usr/lib/python3.6
/home/myuser/projects/myproject/env/lib/python3.6/site-packages

И, следуя ответам в других публикациях, даже если я вручную добавлю myproject, myproject / myproject и myproject / tests к пути через файл .pth, я получуте же сообщения об ошибках.

Что исправляет сообщения об ошибках, так это добавление пустой папки в myproject / myproject, называемой tests.После этого сообщения об ошибках исчезают и тесты запускаются нормально.Может кто-нибудь объяснить, что вызывает это странное поведение?

РЕДАКТИРОВАТЬ: Решение в комментариях.Проблема была из-за верхнего уровня init .py, которого не должно было быть.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

У меня была похожая проблема с некоторым динамическим импортом, и я увидел, что это может решить мою проблему

Если вы проверите класс ContextImport в строке 46 этого файла ekiim / panflute/utils.py (Github Code)

То, что делает этот класс, это то, что он работает как менеджер контекста, так что вы можете дать ему файл (с его абсолютным путем), и он импортируетфайл в этот контекст.

Так что, возможно, изменив этот менеджер контекста, вы можете указать каталог вашего проекта в пути, а затем отменить изменение (при выходе из контекста).

Этот класс работает, помещая путь в первую запись списка sys.path, возможно, это была ваша проблема, и вы просто добавляли в список путей.

Тем не менее, я не уверен, можно ли это считать правильным или питоническим.

0 голосов
/ 02 октября 2018

Вы должны находиться внутри своего тестового каталога, когда запускаете команды для Pytest, чтобы найти ваши тестовые _ *. Py файлы.

Попробуйте исследовать if __name__ == "__main__":, но сначала проверьте документацию Pytest на наличие анти-паттернов и абстракций.Вам может не понадобиться этот шаг, если ваша архитектура соответствует стандартам Pytest.

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