Проблемы импорта Python unittest


Это мой проект настроен:

my_project
    ./my_project
         ./__init__.py
         ./foo
              ./__init__.py
              ./bar.py
         ./tests
             ./__init__.py
             ./test_bar.py

Внутри test_bar.py у меня есть следующий оператор импорта: from foo import bar

Однако, когда я запускаю python /my_project/tests/test_bar.py, я получаю эту ошибку:

ImportError: No module named foo.

Любые идеи, как это исправить?

3 5

3 ответа:

Подумайте о том, что находится на вашем PYTHONPATH. Пакет верхнего уровня для вашего проекта - my_project, так что это должно быть началом любого импорта для чего-либо в вашем проекте.

from my_project.foo import bar

Вы также можете использовать относительный импорт, хотя это не так ясно, и он будет нарушен, если вы когда-либо изменяли относительное расположение модуля, из которого вы выполняли этот импорт.

from ..foo import bar

В идеале папка test не является пакетом вообще и не является частью пакета приложения. Смотрите pytests's страница о надлежащей практике . Для этого необходимо добавить setup.py в пакет и установить его в virtualenv в режиме разработки.
pip install -e .

Не запускайте тесты, указывая непосредственно на файл в вашем приложении. После правильного структурирования / установки проекта используйте механизм обнаружения для любого фреймворка, который вы используете для выполнения тестов. Например, с помощью pytest просто укажите на папку test:

pytest tests

Или для встроенного unittest модуль:

python -m unittest discover -s tests

Можно использовать относительный импорт:

from ..foo import bar

Https://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

Но я также думаю, что использование абсолютных путей с помощью установки вашего проекта в venv является лучшим способом.

import sys
sys.path.append('/path/to/my_project/')

Теперь вы можете импортировать

from foo import bar