使用正则表达式 (REGEX) 从 coverage.py 中获取总覆盖百分比的值

Get value of total coverage percentage from coverage.py using a regular expression (REGEX)

这个问题基本上是关于如何使用正则表达式的,但我在很多非常相关的问题中找不到任何答案。

我使用 coverage.py and py.test 在 gitlab 管道中创建覆盖率报告,看起来像下面的管道传输到文件中,如 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 等提供了自动创建徽章的特定功能。但我想手动创建它以便更好地控制并为每个分支创建徽章。

欢迎任何提示。提前致谢!

这里用awk比较方便:

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

此处 == "TOTAL" 匹配第一个单词为 TOTAL 的行,print $NF+0 打印最后一个字段的数字部分。

与其从非机器可读的输出中获取近似值,不如使用覆盖率的编程 API,coverage xmlcoverage 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
}