У меня есть структура каталога проекта следующим образом (что я считаю довольно стандартным):
my_project
setup.py
mypkg
__init__.py
foo.py
tests
functional
test_f1.py
unit
test_u1.py
Я использую py.test для моей платформы тестирования, и я ожидал, что сможет запустить py.test tests
, когда в каталоге my_project
будут запускаться мои тесты. Это действительно работает, пока я не попытаюсь импортировать код приложения, используя (например) import mypkg
в тесте. В этот момент я получаю сообщение об ошибке "Без модуля с именем mypkg". При выполнении небольшого исследования выясняется, что py.test
запускает тесты с каталогом тестового файла в sys.path
, но не из каталога, из которого py.test
был запущен.
Чтобы обойти это, я добавил файл conftest.py
в мой каталог tests
, содержащий следующий код:
import sys, os
# Make sure that the application source directory (this directory parent) is
# on sys.path.
here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, here)
Это похоже на работу, но является ли это хорошим способом убедиться, что тесты видят код приложения? Есть ли лучший способ достичь этого, или я делаю что-то неправильно в том, как у меня структурирован мой проект?
Я просмотрел некоторые другие проекты, которые используют py.test
(например, pip
), но я не вижу код, который делает что-то подобное, но пока работает py.test tests
. Я не знаю, почему, но я беспокоюсь, что они, возможно, достигли того же результата более простым способом.
Я просмотрел документацию py.test
, но я не вижу объяснения этой проблемы или того, что рекомендуется для ее решения.