#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.