My SUT looks like:
foo.py
bar.py
tests/__init__.py [empty]
tests/foo_tests.py
tests/bar_tests.py
tests/integration/__init__.py [empty]
tests/integration/foo_tests.py
tests/integration/bar_tests.py
When I run nosetests --with-coverage
, I get details for all sorts of
modules that I'd rather ignore. But I can't use the
--cover-package=PACKAGE
option because foo.py
& bar.py
are not in a
package. (See the thread after
http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html
for my reasons for not putting them in a package.)
Can I restrict coverage output to just foo.py & bar.py?
Update - Assuming that there isn't a better answer than Nadia's below, I've asked a follow up question: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"
You can use it like this:
--cover-package=foo --cover-package=bar
I had a quick look at nose source code to confirm: This is the line
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
You can use:
--cover-package=.
or even set environment variable
NOSE_COVER_PACKAGE=.
Tested with nose 1.1.2
I have a lot of top-level Python files/packages and find it annoying to list them all manually using --cover-package, so I made two aliases for myself. Alias nosetests_cover
will run coverage with all your top-level Python files/packages listed in --cover-package. Alias nosetests_cover_sort
will do the same and additionally sort your results by coverage percentage.
nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$( ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',' )"
alias nosetests_cover=$nosetests_cover_cmd
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4"
Notes:
-nr
with -n
in the sort command.Details:
I don't claim that these are the most efficient commands to achieve the results I want. They're just the commands I happened to come up with. =P
The main thing to explain would be the argument to --cover-package. It builds the comma-separated list of top-level Python file/package names (with ".py" stripped from file names) as follows:
\$
-- Escapes the $
character in a double-quoted string.$( )
-- Inserts the result of the command contained within.ls
-- Lists all names in current directory (must be top-level Python directory).| sed -r 's/[.]py$//'
-- In the list, replaces "foo_bar.py" with "foo_bar".| fgrep -v '.'
-- In the list, removes all names without a dot (e.g. removes foo_bar.pyc and notes.txt).| paste -s -d ','
-- Changes the list from newline-separated to comma-separated. I should also explain the sorting.
2>&1
-- Joins stderr and stdout.| fgrep '%'
-- Removes all output lines without a %
character.| sort -nr -k 4
-- Sorts the remaining lines in reverse numerical order by the 4th column (which is the column for coverage percentage). If you want normal order instead of reverse order, replace -nr
with -n
.Hope this helps someone! =)
If you use coverage:py 3.0, then code in the Python directory is ignored by default, including the standard library and all installed packages.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With