#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 и рассмотрю ее! 🙂