Почему pytest-cov не завершается с ошибкой с ненулевым кодом выхода, если порог покрытия кода не достигнут, при работе вPython

Программы на Python
Ответить
Anonymous
 Почему pytest-cov не завершается с ошибкой с ненулевым кодом выхода, если порог покрытия кода не достигнут, при работе в

Сообщение Anonymous »

Если средний порог покрытия тестами для нескольких модулей не достигнут, pytest не выполнит сбой с ненулевым кодом завершения, хотя так и должно быть.
Моя команда:

Код: Выделить всё

❯ pytest --cov module1 --cov module2 --cov module3 --cov-report --cov-fail-under=75
Я получаю следующий результат:

Код: Выделить всё

FAIL Required test coverage of 75.0% not reached. Total coverage: 74.79%
Но код выхода остается нулевым:

Код: Выделить всё

❯ echo $?
0
В результате мой конвейер CI/CD проходит нормально, хотя мой порог покрытия не достигнут. Это приводит к тому, что main имеет слишком низкое тестовое покрытие.
Я пробовал
  • передать --cov=module1,module2,module3 вместо одного вызова pytest с тремя разными аргументами --cov. Это приводит к полному сбою отчета о покрытии, поскольку в нем говорится, что CoverageWarning: Module module1,module2,module3 никогда не импортировался. То есть он пытается импортировать модуль1, модуль2, модуль3 как один модуль, но это не удается, поскольку они являются отдельными модулями.
  • Передача модулей, подлежащих включению, в pyproject.toml в разделе [tool.coverage.run] в аргументе include. Проблема сохраняется: отмечен сбой порога покрытия тестами, но код выхода равен нулю.
  • Интересно, что когда вы тестируете каждый из модулей по отдельности, вы получаете ненулевой код завершения для модуля со слишком низким покрытием.
  • В Интернете я не могу найти работающего решения. Copilot здесь тоже не очень полезен.
Обновление, включая MWE
Мне удалось воспроизвести ошибку. См. README репозитория.
Похоже, проблема в округлении процента покрытия тестами. Как например в моем примере порог покрытия тестами не достигнут (66,66% вместо требуемых 67%). Поэтому я справедливо вижу сообщение FAIL. Требуемый тестовый охват в 67% не достигнут. Общий охват: 66,67%. Тем не менее, код выхода, похоже, учитывает округленные процентные значения с нулевым десятичным значением тестового покрытия по сравнению с пороговым значением тестового покрытия, поскольку код выхода равен нулю.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ge-thresho
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»