Проблемы импорта 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 ответа:
Подумайте о том, что находится на вашем
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 является лучшим способом.