Coverage.py обнаруживает вызовы только во время импорта, а не во время выполнения теста - PullRequest
1 голос
/ 06 августа 2020

Я не могу получить coverage.py, чтобы правильно измерить покрытие кода для моего пакета Python. Что бы я ни пробовал, я получаю покрытие только для кода, запущенного во время импорта, т.е. package/__init__.py и кода, вызываемого оттуда, и 0% покрытия для всего кода, вызываемого во время выполнения тестов. Пакет устанавливается как редактируемая установка с pip install -e . внутри контейнера Docker.

Если я разделю проект, чтобы создать минимальный пример, проблема исчезнет, ​​что означает, что это должно быть вызвано что-то конкретное c в реальном проекте, но, к сожалению, я не могу поделиться фактическим кодом (связанным с работой).

У меня закончились идеи, что попробовать (см. попытки исправления ниже). В чем может быть проблема?

Общая структура проекта

/app/
  setup.py
  package/
    __init__.py
    module1.py
    ...
  tests/
    __init__.py
    conftest.py
    test1.py
    ...

Информация о версии

  • Python: 3.7.2 внутри контейнера Docker на основе python:3.7-slim
  • pytest: 6.0.1
  • pytest-cov: 2.10.0
  • покрытие: 5.2.1

Вещи, которые у меня есть пробовал

  • Проверка пути к коду, запущенному в моих тестах через inspect.getsourcefile(func), чтобы убедиться, что используется правильный исходный файл, а не установленная копия где-то еще
  • Запуск теста / покрытия команды либо через плагин pytest-cov, либо напрямую с помощью coverage run --source package -m pytest tests/ && coverage report
  • Запуск из разных каталогов, например /app/, /app/tests/ и /
  • Настройка PYTHONPATH="."
  • Перемещение каталога package в отдельный каталог src , как рекомендовано в документации Pytest
  • Удаление импорта из conftest.py, чтобы избежать импорта до начала анализа покрытия
  • Импорт кода пакета внутри тестов, а не на уровне тестового модуля
  • Переход на более раннюю версию coverage.py к более ранней версии
...