Импорт 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 58

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.