Это вопрос, который часто задают в разных формах и часто получает ответы "LOL, вы не делаете это правильно". Довольно уверен, что из-за того, что люди (включая меня) используют здравый смысл, пытаются использовать его как реализацию, а решение не очевидно (если вы этого еще не делали).
Принял бы ответ, который "позволяет вылететь из бутылки".
Учитывая
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
Где начинается test_sut.py:
import code.sut
Запуск nosetests в корневом каталоге dir приводит к:
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) кажется предпочтительной.
В любом случае заявления, предлагающие предпочтительное решение, устраняют ощущение "неестественности" в моем собственном.