Получите значение общего процента покрытия от coverage.py использование регулярного выражения (РЕГУЛЯРНОЕ выражение)

#sed #grep #pytest #coverage.py

Вопрос:

Этот вопрос в основном касается того, как использовать регулярные выражения, но я не смог найти на него ответа во многих очень тесно связанных вопросах.

Я создаю отчеты о покрытии в конвейере gitlab, используя coverage.py и py.тест, который выглядит следующим образом, передается в файл, например coverage37.log :

 -------------- generated xml file: /builds/utils/foo/report.xml --------------
---------- coverage: platform linux, python 3.7.11-final-0 -----------
Name                          Stmts   Miss  Cover
-------------------------------------------------
foo/tests/bar1.py                52      0   100%
...
foo/tests/bar2.py                 0      0   100%
-------------------------------------------------
TOTAL                           431      5    99%
======================= 102 passed, 9 warnings in 4.35s ========================
 

Теперь я хочу создать значок для общего охвата, т. Е. здесь значение 99%, и получить только номер (99), чтобы присвоить его переменной. Затем эту переменную можно использовать для создания гибкого значка покрытия с помощью пакета anybadge.

Мой наивный подход был бы чем-то вроде:

 COVERAGE_SCORE=$(sed -n 'what to put here' coverage37.log)
echo "Coverage is $COVERAGE_SCORE"
 

Обратите внимание, что я знаю, что gitlab, github и т.д. Предлагают специальные функции для автоматического создания значков. Но я хочу создать его вручную, чтобы иметь больше контроля и создавать значок для каждой ветви.

Любые намеки приветствуются. Заранее спасибо!

Ответ №1:

Его проще использовать awk здесь:

 cov_score=$(awk '$1 == "TOTAL" {print $NF 0}' coverage37.log)
 

Здесь $1 == "TOTAL" соответствует строке с первым словом как TOTAL и print $NF 0 выводит числовую часть последнего поля.

Ответ №2:

вместо того, чтобы получать приблизительные значения из немашиночитаемых выходных данных, вам лучше всего использовать программные API coverage, либо coverage xml coverage json

вот пример использования вывода json (обратите внимание , что я отправляю его /dev/stdout , по умолчанию он отправляется coverage.json )

 $ coverage json -o /dev/stdout | jq .totals.percent_covered
52.908756889161054
 

там есть еще больше информации, если она вам понадобится:

 $ coverage json -o /dev/stdout | jq .totals
{
  "covered_lines": 839,
  "num_statements": 1401,
  "percent_covered": 52.908756889161054,
  "missing_lines": 562,
  "excluded_lines": 12,
  "num_branches": 232,
  "num_partial_branches": 7,
  "covered_branches": 25,
  "missing_branches": 207
}
 

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

1. Спасибо за этот намек. Я пропустил опцию JSON и рассмотрю ее! 🙂