У меня странные проблемы с tox, py.test, coverage и pytest-cov: когда py.test с --cov вариантом запуском от tox, кажется, требует __init__.py файла в tests папке, которая не сразу очевидно.
При написании этого поста я вроде как решил начальную проблему, добавив вышеупомянутые tests/__init__.py, но на данный момент я не до конца понимаю, почему именно это работает или не работает, поэтому я все еще спрашиваю Помогите. Детали смотрите ниже.
Я нашел связанный вопрос по SO, но это только делает его более запутанным, потому что ответ кажется противоположным тому, что я до сих пор выяснил: файлы 'py.test' и '__init__.py'
Смотрите также официальные документы здесь: py.test - Good Integration Practices (самая нижняя часть страницы).
Упрощенная структура проекта:
setup.py
tox.ini
.coveragerc
project/
__init__.py
module1.py
module2.py
tests/
__init__.py (optional, an empty file)
test_module1.py
test_module2.py
Соответствующая часть tox.ini:
[testenv:check]
commands = py.test --cov=project --cov-report=term
deps =
pytest
coverage
pytest-cov
[pytest]
python_files = test_*.py
norecursedirs = .tox
Соответствующая часть .coveragerc:
[run]
branch = True
omit = project/tests/*
Теперь результаты:
-
py.test --cov=project --cov-report=termвыполнения из корня проекта => правильное покрытие независимо от того,tests/__init__.pyфайлtests/__init__.pyили нет. -
tox -e checkбезtests/__init__.py=> тесты обнаружены и запущены, но я получаю предупреждение "Coverage.py предупреждение: данные не были собраны". и охват составляет 0% для всех модулей -
tox -e checkс помощьюtests/__init__.py=> снова исправьте покрытие.
Для меня не сразу очевидно, почему файл tests/__init__.py должен быть там (добавление этого пустого файла решило начальную проблему) для запуска tox, но это не имеет значения, когда вы запускаете тесты/покрытие вручную. Есть идеи?