Tox 0% покрытие

У меня есть проект на Python, в котором я использую:

  • pipenv
  • токсичный
  • pytest

и многое другое.

По сути, я хочу добавить tox в свои конвейеры gitlab. И почти все вроде работает, вызов mypy, flake8 или black из tox работает нормально. Но когда я вызываю tox -e py37 (поэтому я хочу запустить тесты) с включенным покрытием, тесты запускаются, я вижу их результаты, но покрытие составляет 0% (100% только для пустых __init__ файлов и т. Д.), И я получаю предупреждение: Coverage.py warning: No data was collected. (no-data-collected).

Это моя относящаяся к pytest часть tox.ini:

[tox]
envlist = flake8,mypy,black,py37

[testenv]
extras = tests
commands=
    pytest --cov -ra --tb=short {posargs}

А это мой .coveragerc:

[run]
branch = True
source =
    foo

omit = 
    foo/__init__.py
    foo/__main__.py
    foo/bar/__init__.py
    foo/baz/__init__.py

[report]
exclude_lines =
    pragma: no cover
    if __name__ == .__main__.
show_missing = True

У меня есть рабочий setup.py, который включает все необходимые пакеты: pytest, pytest-cov и многие другие для стиля и т. Д. (Который работает). У меня также __init__.py в папке tests.

Забавно то, что если я вызываю ту же команду, что и в tox.ini, из командной строки (в pipenv): pytest --cov -ra --tb=short, я получаю те же результаты, но с нормальным покрытием (в моем случае это 100%).

Есть способ исправить? Я не хочу, чтобы мои конвейеры показывали неправильное покрытие + даже если они каким-то волшебным образом действительно получат правильное покрытие, я все равно хотел бы увидеть его локально.

P.S Когда я пытался решить проблему, я позвонил в tox с tox --sitepackages -e py37 и получил несколько ошибок, например test command found but not in testenv. И, помимо этих ошибок, мое освещение тогда было в порядке. Но затем я удалил tox, pytest и pytest-cov из своего глобального реестра pip, и теперь с флагом --sitepackages или без него я все еще получаю 0% покрытие


person dabljues    schedule 04.11.2019    source источник
comment
--cov ожидает аргумента, например имя пакета или исходный каталог или файл, например pytest --cov=foo.bar и т. Д.   -  person hoefling    schedule 05.11.2019
comment
.coveragerc позаботится об этом. Кроме того, это не сработало бы из командной строки, если бы проблема была в этом.   -  person dabljues    schedule 05.11.2019


Ответы (2)


Основная причина заключается в том, что pytest во время запуска tox использует установленные источники (в рамках пакетов сайтов), в то время как репортер покрытия считает файлы совпадений в рабочем каталоге (т. е. в вашем локальном репозитории git).


Решение

Добавьте путь виртуального окружения tox к покрытию:

[testenv]
pytest --cov={envsitepackagesdir}/foo

Для получения более подробной информации прочтите замены для разделов, связанных с virtualenv < / а>


Временное решение

Установите PYTHONPATH в рабочий каталог (т.е. export PYTHONPATH=.). Обратите внимание, что вам нужно передать PYTHONPATH в tox:

[testenv]
passenv =
    PYTHONPATH

Это легко, но, используя этот способ, вы не тестируете установку, потому что тесты выполняются на файлах в рабочем каталоге.

person betontalpfa    schedule 27.11.2019
comment
Забыл упомянуть, извините, я действительно решил проблему, поместив пустой файл __init__.py во все каталоги каталогов тестов. Не знаю почему, но это работает. Но я также проверил ваш ответ, и он тоже работает, поэтому я отмечаю его как принятый. Спасибо! - person dabljues; 28.11.2019
comment
@dabljues, который работает, потому что pytest добавляет ваш исходный каталог в PYTHONPATH - вместо этого вы должны тестировать пакет, установленный tox - person Thomas Grainger; 01.09.2020

Основываясь на ответе @betontalpfa, я думаю, что еще одно возможное решение (кажется, хорошо работает в моем случае использования) - это изменить tox.ini, чтобы включить:

[testenv]
deps = -e .
...

AFAIK, установив пакет в рабочий каталог с использованием редактируемого режима pip, вы можете как протестировать установленный пакет, так и избежать несоответствия пути к файлу, вызывающего оценку покрытия 0%.

person Zvi Baratz    schedule 08.06.2021