如何为单个包生成覆盖率xml报告?

6 投票
3 回答
16667 浏览
提问于 2025-04-15 19:27

我正在使用nosecoverage来生成代码覆盖率报告。目前我只有一个包,叫做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时,覆盖率工具却拉进了更多不必要的包,包括和我的代码毫无关系的python emaillogging包。

如果我运行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文件呢?

3 个回答

0

你试过这个吗:

coverage xml ae
3

我遇到过类似的问题,后来用--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/这个选项更有用。

0

我找不到这个问题的答案,所以我在处理后把不需要的包元素去掉。这个函数接收原始的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')

撰写回答