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$//'
| 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 (eg removes foo_bar.pyc and notes.txt). | paste -s -d ','
| 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 '%'
| fgrep '%'
-- Removes all output lines without a %
character. | sort -nr -k 4
| 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! =)
如果使用coverage:py 3.0 ,则默认情况下会忽略Python目录中的代码,包括标准库和所有已安装的软件包。
I would do this:
nosetests --with-coverage --cover-package=foo,bar tests/*
I prefer this solution to the others suggested; it's simple yet you are explicit about which packages you wish to have coverage for. Nadia's answer involves a lot more redundant typing, Stuart's answer uses sed and still creates a package by invoking touch __init__.py
, and --cover-package=.
doesn't work for me.
For anyone trying to do this with setup.cfg, the following works. I had some trouble figuring out how to specify multiple packages.
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
您可以改进接受的答案,例如--cover-package=foo,bar
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.