Импорт Python для тестов с использованием nose - что лучше всего подходит для импорта модулей выше текущего пакета
это вопрос, который часто задают в разных формах, и часто получает ответы "lol вы не делаете это правильно". Довольно уверен, что это потому, что есть сценарий здравого смысла, который люди (включая меня) пытаются использовать в качестве реализации, и решение не очевидно (если вы этого не делали раньше).
принял бы ответ ,который"позволяет летать из бутылки".
дано
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
где tests_sut.py начинается:
import code.sut
запуск nosetests в корневом каталоге приводит к:
ImportError: No module named code.sut
проспекты выезжали:
a) сделайте родственника с помощью
from ..code import sut
b) добавить корень проекта в PYTHONPATH
c) используйте
sys.path.append
добавить .. путь перед импортом в начале каждого тестового модуля.
d) просто не забудьте сделать
setup.py
на проект для установки модулей в сайт-пакеты раньше ходовые испытания.
таким образом, требование состоит в том, чтобы иметь тесты, расположенные под корнем тестового пакета, которые имеют доступ к проекту. Каждый из вышеперечисленных не чувствует себя "естественным" для меня, оказался проблематичным или кажется слишком тяжелой работой!
в java это работает, но в основном с помощью вашего инструмента сборки / IDE, размещающего все ваши классы на пути к классам. Возможно, проблема в том, что я ожидаю "волшебства" от Python? Отмечали в тестах webframework флягу, вариант D), кажется, будьте предпочтительнее.
в любом случае, приведенные ниже утверждения, рекомендующие предпочтительное решение, устранят чувство "неестественности" в моем собственном.
3 ответа:
вы уже довольно хорошо ответили на свой вопрос.. D (install to system location) является предпочтительным для распространяемого кода. Я обычно использую C (modify sys.путь), потому что я не хочу общесистемных установок моих сотен пользовательских библиотек. В теории a (относительный импорт) кажется более приятным, но есть случаи, когда он терпит неудачу. B (PYTHONPATH) прямо, действительно только для целей тестирования, на мой взгляд.
это в значительной степени суммирует все варианты. Вариант, который вы предпочитаете (Python magically знает, где искать) на самом деле не является работоспособным решением, потому что это может привести к непредсказуемым результатам, таким как автоматический поиск библиотек из несвязанных проектов.
на мой взгляд, лучше всего сделать это в точке входа в вашу программу:
import sys, os sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
У меня была такая же проблема, и я нашел ответ в работе для меня вопрос.
просто удалите __init__.py в корне проекта.
Я знаю, что есть проверенный ответ, и я все еще думаю, что это хорошая причина поделиться другими альтернативами :)
есть нос-pathmunge давая вам контроль, чтобы установить
sys.path
, а вызовnosestests
.