如何为单个包生成覆盖率 xml 报告?
Posted
技术标签:
【中文标题】如何为单个包生成覆盖率 xml 报告?【英文标题】:How do I generate coverage xml report for a single package? 【发布时间】:2011-01-18 14:46:48 【问题描述】:我正在使用 nose 和 coverage 来生成覆盖率报告。我现在只有一个包,ae,所以我指定只覆盖它:
nosetests -w tests/unit --with-xunit --with-coverage --cover-package=ae
这是结果,看起来不错:
Name Stmts Exec Cover Missing
----------------------------------------------
ae 1 1 100%
ae.util 253 224 88% 39, 63-65, 284, 287, 362, 406
----------------------------------------------
TOTAL 263 234 88%
----------------------------------------------------------------------
Ran 68 tests in 5.292s
但是,当我运行coverage xml
时,coverage 会引入不必要的包,包括与我的代码无关的 python email 和 logging 包。
如果我运行coverage xml ae
,我会得到这个错误:
No source for code: '/home/wraith/dev/projects/trimurti/src/ae':
[Errno 21] Is a directory: '/home/wraith/dev/projects/trimurti/src/ae'
有没有办法为 ae 包生成 XML?
【问题讨论】:
【参考方案1】:我遇到了类似的问题,并使用--omit
选项解决了它。这使其运行速度更快,并将coverage.xml 的大小从 2MB 减少到 70kB。
--omit=PRE1,PRE2,... Omit files when their filename path starts with one of
these prefixes.
我使用的是 Mac OS X,所以我省略了 /Library/ 和 /Applications/ 文件夹:
$ coverage xml --omit=/Library/,/Applications/
在其他系统上,您可能会发现--omit=/usr/
更有帮助。
【讨论】:
太棒了!有没有办法在没有完整路径的情况下做到这一点? 您不必提供完整路径,只需提供绝对路径的前缀(第一部分)即可。如果您要问的话,我认为您不能使用相对路径。【参考方案2】:你试过了吗:
coverage xml ae
【讨论】:
我收到以下错误:没有代码源:'/home/matthew/dev/projects/trimurti/src/ae':[Errno 21] 是目录:'/home/matthew/开发/项目/trimurti/src/ae' 谁否决了这个解决方案?这是唯一对我有用的解决方案【参考方案3】:我无法找到这个问题的答案,所以我在处理后去除了不需要的包元素。此函数获取原始 XML 文件、要检查的元素名称、要检查的属性、要保留的模式(或单词列表)以及新文件的目标文件路径。
from lxml import etree
def keep(self, xmlfile, elem_name, attr_name, pattern, dst):
try:
rep = re.compile(pattern)
except TypeError:
# Create regex pattern if a list is given.
# TypeError: unhashable type: 'list'
rep = re.compile("|".join(pattern))
dom = etree.parse(xmlfile)
for node in dom.findall('//%s' % elem_name):
if not rep.search(node.get(attr_name)):
node.getparent().remove(node)
dom.write(dst)
为了解决我的问题,我这样称呼它:
keep('coverage.xml', 'package', 'name', 'ae|tests', 'wanted-coverage.xml')
【讨论】:
正确的方法是在运行coverage.py期间排除它们是在包含您正在测试的目录的根目录中创建一个文件 .coveragerc ,其内容如下 [run] omit = # 忽略 .local 目录中的任何内容 */.local/* # 忽略 /usr /usr/* 中的所有内容 */local/* 一些很好的例子可以在这里找到 —> coverage.readthedocs.io/en/coverage-4.4.2/config.html以上是关于如何为单个包生成覆盖率 xml 报告?的主要内容,如果未能解决你的问题,请参考以下文章
Azure DevOps:如何为不同的测试(.net core、angular)合并两个代码覆盖率报告
以 Clover XML 格式生成代码覆盖率报告...致命错误:无法重新声明 preprocessGrammar()