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

Cor*_*yer 3 grep sed coverage.py pytest

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

我使用coverage.pypy.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 ========================
Run Code Online (Sandbox Code Playgroud)

现在我想为总覆盖率创建一个徽章,即此处的 99% 值,并且仅获取数字 (99) 以便将其分配给变量。然后可以使用该变量使用anybadge包创建灵活的覆盖徽章。

我天真的方法是这样的:

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

请注意,我知道 gitlab、github 等提供了自动创建徽章的特定功能。但我想手动创建它,以便有更多的控制权并为每个分支创建徽章。

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

anu*_*ava 5

这里使用起来更方便awk

cov_score=$(awk '$1 == "TOTAL" {print $NF+0}' coverage37.log)
Run Code Online (Sandbox Code Playgroud)

这里$1 == "TOTAL"匹配第一个单词为的行TOTALprint $NF+0打印最后一个字段的数字部分。


Ant*_*ile 5

最好使用coverage的编程api,而不是从非机器可读的输出中获取近似值,coverage xml或者coverage json

这是一个使用 json 输出的示例(注意我将其发送到/dev/stdout,默认情况下它会发送到coverage.json

$ coverage json -q -o /dev/stdout | jq .totals.percent_covered
52.908756889161054
Run Code Online (Sandbox Code Playgroud)

如果您需要的话,还有更多信息:

$ coverage json -q -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
}
Run Code Online (Sandbox Code Playgroud)