Cor*_*yer 3 grep sed coverage.py pytest
这个问题基本上是关于如何使用正则表达式,但我在很多非常密切相关的问题中找不到任何答案。
我使用coverage.py和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 ========================
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 等提供了自动创建徽章的特定功能。但我想手动创建它,以便有更多的控制权并为每个分支创建徽章。
欢迎任何提示。提前致谢!
这里使用起来更方便awk:
cov_score=$(awk '$1 == "TOTAL" {print $NF+0}' coverage37.log)
Run Code Online (Sandbox Code Playgroud)
这里$1 == "TOTAL"匹配第一个单词为的行TOTAL并print $NF+0打印最后一个字段的数字部分。
最好使用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)