如何使用nosetests从python coverage报告中排除mock包

时间:2012-08-29 21:58:54

标签: python mocking code-coverage nose python-mock

我目前尝试使用模拟库在python中编写一些基本的单元测试。

在完成一些基本示例之后,我现在尝试使用nosetests --with-coverage,现在我有了模拟包,我试图'模拟掉'的包显示在覆盖率报告中。是否有可能排除这些?

这是我要测试的课程:

from imaplib import IMAP4

class ImapProxy:
    def __init__(self, host):
        self._client = IMAP4(host)

和测试用例:     来自模拟导入补丁

from ImapProxy import ImapProxy

class TestImap:
    def test_connect(self):
        with patch('ImapProxy.IMAP4') as imapMock:
            proxy = ImapProxy("testhost")
            imapMock.assert_called_once_with("testhost")

我现在获得nosetests --with-coverage

的以下输出
.
Name         Stmts   Miss  Cover   Missing
------------------------------------------
ImapProxy        4      0   100%   
imaplib        675    675     0%   23-1519
mock          1240    810    35%   [ a lot of lines]

有没有办法排除模拟软件包和imaplib软件包,而不得不按--cover-package=PACKAGE

手动将所有软件包列入白名单

感谢Ned Batchelder,我现在知道.coveragerc文件了,谢谢!

我创建了一个包含以下内容的.coveragerc文件:

[report]
omit = *mock*

现在,我在覆盖率报告中的模拟输出是:

mock                     1240   1240     0%   16-2356

它不再涵盖模拟包,但仍会在报告中显示。

如果有任何帮助,我使用Coverage.py,版本3.5.2。

3 个答案:

答案 0 :(得分:32)

创建一个.coveragerc文件,该文件排除报告中不需要的内容:http://nedbatchelder.com/code/coverage/config.html

答案 1 :(得分:14)

在.coveragerc中将omit条目从[report]部分移至[run]部分。

答案 2 :(得分:2)

我有一个类似的情况测试我的主程序包目录中的一系列子包。我在我的模块的顶级目录中运行nosetests并且Mock并且其他库包含在覆盖率报告中。我尝试在nosetests中使用--cover-module my_package,但之后没有包含子包。

运行以下内容解决了我的问题:

nosetests --with-coverage --cover-erase --cover-package ../my_package

因此,如果您要测试的所有代码都在同一目录中,然后您可以通过指定{{的模块路径来单独获得它的覆盖范围1}}。这样就无需单独将每个子模块列入白名单。

(Python 2.7.6,coverage 4.0.3,nose 1.3.7)