Python Coverage превращает имя пакета верхнего уровня в точку

У меня есть проект, изложенный так:

proj/ex_secure/__init__.py
proj/ex_secure/base.py
proj/ex_secure/metrics.py
proj/ex_secure/keys.py
proj/tests/test_base.py
proj/tests/test_metrics.py
proj/tests/test_keys.py
proj/.gitignore
proj/.pep8
proj/README.rst
proj/setup.cfg
proj/setup.py

Если я бегу pytest как это:

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure

Затем пакет верхнего уровня в результате coverage.xml назван .:

<package branch-rate="0.4722" complexity="0" line-rate="0.6801" name=".">

Но если я позвоню pytest как это:

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure.base --cov=ex_secure.metrics --cov=ex_secure.keys

Тогда пакет верхнего уровня правильно назван ex_secure:

<package branch-rate="0.4722" complexity="0" line-rate="0.6801" name="ex_secure">

Пока это хороший обходной путь, но он не идеален. Если я добавлю больше пакетов, мне придется продолжать перечислять их (или они будут отсутствовать в отчете о покрытии). Дополнительно, __init__.py не распространяется с использованием этого механизма.

Что я здесь не так делаю?

ОБНОВЛЕНИЕ 1:

Если я запускаю Python Coverage напрямую вместо использования pytest-covработает как положено:

coverage run --branch --source=ex_secure -m pytest -s --junitxml=pytests.xml
coverage xml

Затем:

<package branch-rate="0.4722" complexity="0" line-rate="0.6771" name="ex_secure">

ОБНОВЛЕНИЕ 2:

Если я запустил PyTest, как я делал изначально, но затем заново сгенерировал отчет XML с помощью Python Coverage, пересозданный отчет будет исправлен, но его значения немного отличаются:

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure
coverage xml

Затем:

<package branch-rate="0.3058" complexity="0" line-rate="0.4769" name="ex_secure">

1 ответ

Решение

К сожалению, это довольно неприятная ошибка из двух частей, которая охватывает как Py-Coverage, так и PyTest-Cov. Это подробно описано на PyTest-Cov GitHub и Py-Coverage BitBucket.

Короче звоним coverage xml из командной строки не позволяет вам пройти в sourcesтак что большинство людей не видят эту проблему, но вы можете пройти в sources при использовании Python API для Py-Coverage, и этот API неправильно обрабатывает sources приписывать. Между тем PyTest-Cov использует Python API для Py-Coverage, поэтому при вызове PyTest-Cov с --cov=xxxx а также --cov-report xml, вы в конечном итоге с этой проблемой.

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