У меня странные проблемы с 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
, но это не имеет значения, когда вы запускаете тесты/покрытие вручную. Есть идеи?