如何为单个包生成coverage xml报告?

时间:2010-02-19 02:11:01

标签: python code-coverage nose coverage.py

我正在使用鼻子覆盖率来生成报道报告。我现在只有一个包, 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 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?

3 个答案:

答案 0 :(得分: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/更有帮助。

答案 1 :(得分: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')

答案 2 :(得分:-1)

你有没有尝试过:

coverage xml ae