Test coverage with nose and coverage.py
It's fun to use nose + coverage.py to show my progress as I write tests. Seeing the bar next to my code change from red to green makes me happy. 100% test coverage does not mean tests are complete. For example, a boolean OR'ed conditional expression may not test all conditions even though the line is marked as covered. Other limitations are discussed here: Flaws in coverage measurement. However, good test coverage is at least a step towards having a good test suite.
Install nose and coverage.py¶
Activate your virtualenv and pip install nose and coverage.
$ pip install nose
$ pip install coverage
Run it¶
Here is the command line I use to run the tests. --with-coverage
enables the nose-coverage plugin to check test coverage. --cover-erase
erases coverage test results from a previous run. --cover-package
specifies which Python package to analyze. Specifiy the package as you would using an import
(e.g. dp.blueprints.info.views
). If --cover-package
is not specified, it will analyze everything. --cover-html
enables pretty HTML coverage reports. This example is for the flask-encryptedsession tests.
$ nosetests --with-coverage --cover-erase --cover-package=flask_encryptedsession --cover-html
..........
Name Stmts Miss Cover Missing
-----------------------------------------------------------------------
flask_encryptedsession 0 0 100%
flask_encryptedsession.encryptedcookie 41 1 98% 176
flask_encryptedsession.encryptedsession 35 1 97% 75
-----------------------------------------------------------------------
TOTAL 76 2 97%
----------------------------------------------------------------------
Ran 10 tests in 0.188s
OK
Display the HTML report¶
$ firefox cover/index.html
Get branch coverage¶
Branch coverage is useful for checking "if" statements without an explicit "else" in the code. I had to install the development version of nose to use this feature: As of version 1.2.0, this feature is available.
$ pip install https://github.com/nose-devs/nose/tarball/master
$ nosetests --cover-branches --with-coverage --cover-erase --cover-package=flask_encryptedsession --cover-html
..........
Name Stmts Miss Branch BrPart Cover Missing
-------------------------------------------------------------------------------------
flask_encryptedsession 0 0 0 0 100%
flask_encryptedsession.encryptedcookie 41 1 12 1 96% 176
flask_encryptedsession.encryptedsession 35 1 4 1 95% 75
-------------------------------------------------------------------------------------
TOTAL 76 2 16 2 96%
----------------------------------------------------------------------
Ran 10 tests in 0.234s
OK
Comments
In a later comment, I would love to go over some of the reasoning behind our choices. Tremendous information here. I really do like perusing your blog.
I learned a vast amount from them.
Thank You! I got all what i was looking! Have a nice day! :)
Is there a way to run coverage on just one file in a project (instead of whole package)?
Thanks for the write up! Very helpful.
disqus:2136601944