Импорт Python для тестов с использованием носа - как лучше всего импортировать модули выше текущего пакета

Это вопрос, который часто задают в разных формах и часто получают ответы типа «лол, ты не делаешь это должным образом». Совершенно уверен, что это потому, что есть Сценарий здравого смысла люди (включая меня) пытаются использовать в качестве реализации, и решение неочевидно (если вы не делали этого раньше).

Примет ответ, который «позволяет вылететь из бутылки» .

Учитывая

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py

Где начинается tests_sut.py:

import code.sut

Запуск тестов в корневом каталоге приводит к:

ImportError: No module named code.sut

Пройденные пути:

a) сделать родственника с помощью

from ..code import sut

b) добавить корень проекта в PYTHONPATH

c) используйте

sys.path.append

, чтобы добавить путь .. перед импортом в начале каждого тестового модуля.

d) просто не забудьте выполнить

setup.py 

в проекте, чтобы установить модули в пакеты сайта перед запуском тестов.


Таким образом, требуется, чтобы тесты располагались под корнем тестового пакета, у которого есть доступ к проекту. Все вышеперечисленное не кажется мне "естественным", оказалось проблематичным или кажется слишком тяжелым!

В java это работает, но в основном с помощью вашего инструмента сборки / IDE, размещающего все ваши классы в пути к классам . Возможно, проблема в том, что я жду «волшебства» от Python? В тестах веб-фреймворков Flask было отмечено, что вариант d) кажется предпочтительным.

В любом случае приведенные ниже утверждения, рекомендующие предпочтительное решение, устранят ощущение "неестественности" в моем собственном.

64
задан CharlesB 25 February 2013 в 15:26
поделиться