Создание py.test, покрытие и ток работают вместе: __init__.py в папке тестов?

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

Ответы

Ответ 1

Используйте --cov {envsitepackagesdir}/<your-package-name> в tox.ini.

Ответ 2

Смотрите: Использование py.test с покрытием не включает импорт

Я избавился от использования pytest-cov и сразу же pytest-cov coverage..

Также заметил, что с pytest мне нужно было пустое __init__.py в моей тестовой директории для правильной работы. Вероятно, для этого есть причина.

Я понимаю, что это пара лет, но в случае, если кто-то еще сталкивается с этим..

Ответ 3

Другой вариант с tox заключается в установке PYTHONPATH в tox.ini:

[testenv] setenv = PYTHONPATH = {toxinidir} commands = pytest --cov=<your package> - codecov