Проблемы между включением и источником с coverage.py

#python #pytest #code-coverage #coverage.py

Вопрос:

У меня есть проект, который настроен со следующей минимальной структурой:

 workspace/
  |- .venv/ # virtual environment
  |- .vscode/ # ide settings
  |- my.repo.folder/ # git repo. Note: these have periods in their names
    |- coverage/
      |- .report # data file
      |- html/ # folder for HTML report
    |- service / # service package folder
      |- __init__.py
      |- ...
    |- tests/ # tests folder
      |- test_a.py
      |- test_b.py
      |- ...
    |- conftest.py # pytest configuration
    |- pyproject.toml # project configuration
    |- handler.py # AWS Lambda entry

 

Как правило, у нас есть папка рабочей области, в которую мы клонируем одно репо. На верхнем уровне находятся конфигурация рабочей области, виртуальная среда и т. Д. Артефакты вместе с самим репо. В репо у нас есть service папка для всего исходного кода в виде пакета python и handler.py файл в качестве точки входа (это для функции AWS Lambda). Кроме того, мы используем поэзию для всей упаковки и управления зависимостями, поэтому конфигурация проекта хранится внутри pyproject.toml . Я включил параметры конфигурации ниже.

 [tool.pytest.ini_options]
addopts = "-v"
testpaths=[
    "tests"
]
log_cli = true
log_cli_level = "INFO"
log_file = "logs/pytest.log"
log_file_level = "DEBUG"
markers = []

[tool.coverage.run]
source = ['service']
command_line = '-m pytest tests'
dynamic_context = "test_function"
data_file = 'coverage/.report'

[tool.coverage.report]
show_missing = true

[tool.coverage.html]
show_contexts = true
directory = 'coverage/html'
 

Проблема в том , что когда source = ['service'] покрытие работает должным образом, но не включает основной handler.py модуль. Когда я заменяю эту строку на include = ['*/service/**', '*/handler.py'] , ничто не захватывается coverage.py. На самом деле, если я вообще опущу эту строку, по умолчанию ничего из service или даже handler.py не будет включено. Единственные модули, о которых сообщается , находятся .venv за ПРЕДЕЛАМИ CWD (супер запутанные) conftest.py , и тестовые модули внутри tests . Моя интуиция подсказывает, что если я могу указать service в source опции, то покрытие должно, по крайней мере, охватывать эту папку в ее пути по умолчанию, верно?

Может ли кто-нибудь, пожалуйста, помочь мне устранить неполадки, как получить покрытие для отчета как по handler.py модулю, так и по service пакету?

Ответ №1:

Попробуйте использовать:

 source = ['service', 'handler']
 

Комментарии:

1. Я попробовал это, и он по-прежнему сообщает только на основе service одного пакета. Насколько мне известно, source принимает только посылки. Но странная вещь, опять же, для меня заключается в том, что если я полностью опущу источник, он даже не распознается service как пакет для применения покрытия.

2. Добавьте --debug=trace к своим coverage run параметрам, чтобы понять, почему это исключение handler.py.