30

我目前尝试使用模拟库在 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]

有什么方法可以排除 mock 包和 imaplib 包,而无需手动将除这些包之外的所有包都列入白名单--cover-package=PACKAGE

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

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

[report]
omit = *mock*

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

mock                     1240   1240     0%   16-2356

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

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

4

3 回答 3

32

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

于 2012-08-30T14:18:37.853 回答
14

在您的 .coveragerc 中,将您的omit条目从该[report]部分移动到该[run]部分。

于 2013-05-07T19:00:09.583 回答
2

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

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

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

因此,如果您要测试的所有代码都在同一个目录中,那么您可以通过将模块路径指定为nosetests. 这避免了单独将每个子模块列入白名单的需要。

(Python 2.7.6,覆盖率 4.0.3,鼻子 1.3.7)

于 2016-03-02T09:57:39.053 回答