Я слежу за этим не-src макетом, как показано в pytest doc:
setup.py
mypkg/
...
tests/
__init__.py
foo/
__init__.py
test_view.py
bar/
__init__.py
test_view.py
Док говорит:
Теперь pytest загрузит модули как tests.foo.test_view
и tests.bar.test_view
, что позволит вам иметь модули с одинаковыми именами. Но теперь возникает небольшая проблема: чтобы загрузить тестовые модули из каталога tests
, pytest добавляет корень хранилища к sys.path
, что добавляет побочный эффект, который теперь mypkg
также можно импортировать. Это проблематично, если вы используете инструмент, подобный tox, для тестирования вашего пакета в виртуальной среде, потому что вы хотите проверить установленную версию вашего пакета, а не локальный код из репозитория.
В этой ситуации настоятельно предлагается использовать макет src
, в котором корневой пакет приложения находится в подкаталоге вашего корня ...
Но tox говорит, что это sdist-пакет, установить и протестировать.
Так вот чего я не понимаю:
... потому что вы хотите протестировать установленную версию вашего пакета, а не локальный код из хранилища ...
Я думаю, что большую часть времени при разработке мы хотим протестировать - это локальный код из хранилища. Обычно это ветка разработки или ночная, а не стабильная ветка, которая может быть установлена в нашей системе.
И я провел несколько экспериментов. Я создаю программный пакет mypkg
, устанавливаю его стабильную ветвь, а затем изменяю некоторый код в ветке разработки, чтобы прервать тест. Если mypkg
не указан в src
dir, то pytest протестирует локальный код , потому что он может найти пакет mypkg
по локальному пути, и тест будет прерван, как и ожидалось. Однако, если mypkg
установлен в src
dir, то pytest вместо этого протестирует установленный код , потому что он может найти только mypkg
там, и тест не будет прерван, пока должен.
Так что только макет non-src работает как положено. Он работает, как и ожидалось, даже с tox: tox будет sdist и установит пакет в изолированной среде, на которую mypkg
в локальном пути не влияет Таким образом, токси действительно тестирует локальный код, а не установленный код. Это то, что мы ожидаем.
Учитывая, что не-src макет работает правильно, почему доктор сказал, что это небольшая проблема и настоятельно рекомендуют использовать src макет?
Edit. Не ожидал, что это будет дискуссия .