ModuleNotFoundError с pytest - PullRequest
       5

ModuleNotFoundError с pytest

0 голосов
/ 27 февраля 2019

Я хочу, чтобы моя папка test отделяла от кода моего приложения.Моя структура проекта выглядит так:

myproject/
  myproject/
    myproject.py
    moduleone.py
  tests/
    myproject_test.py

myproject.py

from moduleone import ModuleOne

class MyProject(object)
....

myproject_test.py

from myproject.myproject import MyProject
import pytest

...

Я использую myproject.myproject, так как я использую команду

python -m pytest

из корневого каталога проекта ./myproject/

Однако при импорте в эти модули происходит сбой с

E ModuleNotFoundError: Нет модуля с именем 'moduleone'

Я использую Python 3.7 и прочитал, что с версии 3.3 пустые __init__ файлы больше не нужны, что означает, что мой проект становится неявным пакетом пространства имен

Однако я попытался добавить файл __init__.py в myproject/myproject/, а также попытался добавить файл conftest.py в myproject/, но ни один из них не работает

У меня есть прочитанные ответы , которые говорят возиться с путями , а затем комментарии с комментариями к другим вопросам, говорящие , а не .

Как правильно и чего мне не хватает?

EDIT;

Возможно, связано, я использовал requirements.txt для установки pytest с использованием pip.Может ли это быть связано?И если да, то как правильно установить Pytest в этом случае?

EDIT 2:

Один из путей в sys.path - это /usr/src/app/, которыйтом докера настроен на /my/local/path/myproject/.

должен ли том быть /my/local/path/myproject/myproject/ вместо этого?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Похоже, что sys.path должен включать каталог приложения , а не корневую папку проекта, содержащую каталог приложения и тестовый каталог.

Так что в моем случае /my/local/path/myproject/myproject/должен был быть в sys.path, а не /my/local/path/myproject/.

Тогда я могу запустить pytest в /my/local/path/myproject/ (не нужно python -m pytest).Это означало, что модули в /myproject/myproject/ могли находить друг друга и тесты без вложений пространства имен.

Так что мои тесты выглядели как

 from moduleone import ModuleOne
 import pytest

 def test_fun():
     assert ModuleOne.example_func() == True

Тем не менее, похоже, что много ошибок , поэтому я понятия не имею, правильно ли это ..

0 голосов
/ 27 февраля 2019

Обязательно включите . точку в $PYTHONPATH env var.

Этот фрагмент кода можно использовать для устранения таких проблем:

import pprint
import sys
pprint.pprint(sys.path)

Ваш вопрос удалось использоватьmyproject на трех разных уровнях.По крайней мере, во время отладки вы можете использовать три разных имени, чтобы уменьшить возможную путаницу.

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