Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to exclude mock package from python coverage report using nosetests

I currently try to use the mock library to write some basic nose unittests in python.

After finishing some basic example I now tried to use nosetests --with-coverage and now I have the mock package and the package I tried to 'mock away' are shown in the coverage report. Is there a possibility to exclude these?

Here is the class I want to test:

from imaplib import IMAP4

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

And the testcase: from mock import patch

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")

I now get the following output for 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]

Is there any way to exclude the mock package and the imaplib package without having to manually whitelisting all but those packages by --cover-package=PACKAGE

Thanks to Ned Batchelder I now know about the .coveragerc file, thanks for that!

I created a .coveragerc file with the following content:

[report]
omit = *mock*

Now my output for mock in the coverage report is:

mock                     1240   1240     0%   16-2356

It does not cover the mock package any longer but still shows it in the report.

I use Coverage.py, version 3.5.2 if this is any help.

like image 268
Frederick Roth Avatar asked Aug 29 '12 21:08

Frederick Roth


3 Answers

Create a .coveragerc file that excludes what you don't want in the report: http://nedbatchelder.com/code/coverage/config.html

like image 106
Ned Batchelder Avatar answered Nov 08 '22 01:11

Ned Batchelder


In your .coveragerc move your omit entry from the [report] section to the [run] section.

like image 26
Thomas E Jenkins Avatar answered Nov 08 '22 02:11

Thomas E Jenkins


I had a similar situation testing a series of sub-packages within my main package directory. I was running nosetests from within the top directory of my module and Mock and other libraries were included in the coverage report. I tried using --cover-module my_package in nosetests, but then the subpackages were not included.

Running the following solved my problem:

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

So, if all the code that you want to test is in the same directory, then you can get coverage for it alone by specifying the module path to nosetests. This avoids the need to whitelist each of the submodules individually.

(Python 2.7.6, coverage 4.0.3, nose 1.3.7)

like image 2
Dr John A Stevenson Avatar answered Nov 08 '22 03:11

Dr John A Stevenson