Поэзия и Pytest-cov с сонаром: как совместить ссылки?

Я перевожу все свои модули в Poetry, и у меня есть проблема.

Прежде чем с python setup.py test Я смог выполнить свои тесты с правильной информацией о покрытии.

Сейчас я перехожу к поэзии, поэтому мой лучший вариант poetry run pytest или иным образом poetry install; pytest, В обоих случаях я должен указать местоположение источника в Сонаре, чтобы собрать данные покрытия. Здесь я бы, естественно, просто передать мой src папка, но, очевидно, ссылки будут неправильными, потому что pytest работает с использованием кода, установленного в среде поэзией, а не в локальном коде, как это было раньше, поэтому ссылки будут несоответствующими. Кажется, что не работает ничего.

Итак, есть ли способ в поэзии использовать локальные ссылки вместо ссылок среды при работе с pytest? Или я должен сдаться и использовать какой-то странный трюк с inspect получить путь к установленному пакету в site-packages папка?

1 ответ

Ваша текущая настройка, где pytest запуск против установленного пакета вместо исходных файлов является значительно более предпочтительным, так как он имитирует поведение кода, как он будет себя вести при использовании. Ошибки пути, файлы, которые не были правильно помечены / перемещены для установки, или любые другие вещи, которые могут пойти не так во время развертывания, будут обнаружены сразу же без каких-либо затрат.

Это также помогает обеспечить более точное покрытие, поскольку, например, любые файлы сборки, которые не являются частью пакета, будут игнорироваться. Все что нужно для того чтобы рассказать coverage смотреть на пакет вместо ваших исходных файлов - значит сказать именно это. Имея это в вашем .coveragerc должно быть достаточно:

[run]
source = sample_project

Учитывая структуру проекта, подобную этой [1]

.
├── .coveragerc
├── src
│   └── sample_project
│       ├── __init__.py
│       └── util.py
└── tests
    ├── __init__.py
    └── test_util.py

Бег pytest --cov tests/ выглядит внутри установленного пакета правильно:

Test session starts (platform: linux, Python 3.7.2, pytest 3.10.1, pytest-sugar 0.9.2)
rootdir: /home/user/dev/sample_project, inifile:
plugins: sugar-0.9.2, cov-2.7.1
collecting ... 
 tests/test_util.py ✓                                                  100% ██████████

----------- coverage: platform linux, python 3.7.2-final-0 -----------
Name                 Stmts   Miss  Cover
----------------------------------------
tests/__init__.py        0      0   100%
tests/test_util.py       6      0   100%
----------------------------------------
TOTAL                    6      0   100%


Results (0.10s):
       1 passed

[1] Может быть важно отделить исходный код в каталоге, чтобы избежать затенения имен (механизм импорта предпочтет локальный пакет foo в своей PYTHONPATH, частью которого является рабочий каталог, а не установленный пакет foo). Из вашего описания, кажется, что вы уже делаете это. Если вы этого не сделаете, подумайте о том, чтобы снова создать свой проект с поэзией new и с ее необязательным флагом --src.

Другие вопросы по тегам