pytest: зачем использовать макет src? - PullRequest
0 голосов
/ 31 октября 2018

Я слежу за этим не-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. Не ожидал, что это будет дискуссия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...