我的SUT看起来像:
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
当我运行nosetests --with-coverage
时,我会获得各种详细信息
我宁愿忽略的模块。但我不能用
--cover-package=PACKAGE
选项foo.py
选项bar.py
{{1}}不在
包。 (见后的帖子
http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html
因为我不把它们放在一个包里的原因。)
我可以将覆盖范围输出限制为foo.py& bar.py?
更新 - 假设没有比Nadia更好的答案,我提出了一个跟进问题:"How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"
答案 0 :(得分:20)
你可以像这样使用它:
--cover-package=foo --cover-package=bar
我快速浏览了鼻子源代码以确认:This is the line
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
答案 1 :(得分:12)
您可以使用:
--cover-package=.
甚至设置环境变量
NOSE_COVER_PACKAGE=.
用鼻子1.1.2测试
答案 2 :(得分:4)
我有很多顶级Python文件/软件包,并且发现使用--cover-package手动列出它们很烦人,所以我为自己创建了两个别名。别名nosetests_cover
将覆盖--cover-package中列出的所有顶级Python文件/包。别名nosetests_cover_sort
将执行相同的操作,并按覆盖百分比对结果进行排序。
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"
注意:
-nr
替换为-n
。详细说明:
我不是声称这些是实现我想要的结果的最有效的命令。他们只是我碰巧提出的命令。 = P
要解释的主要问题是--cover-package的论点。它构建了以逗号分隔的顶级Python文件/包名称列表(使用" .py"从文件名中删除),如下所示:
\$
- 在双引号字符串中转义$
个字符。$( )
- 插入。ls
- 列出当前目录中的所有名称(必须是顶级Python目录)。| sed -r 's/[.]py$//'
- 在列表中,替换" foo_bar.py"用" foo_bar"。| fgrep -v '.'
- 在列表中,删除所有没有点的名称(例如删除foo_bar.pyc和notes.txt)。| paste -s -d ','
- 将列表从换行符分隔为逗号分隔。 我还应该解释排序。
2>&1
- 加入stderr和stdout。| fgrep '%'
- 删除没有%
字符的所有输出行。| sort -nr -k 4
- 按第四列(覆盖百分比列)的倒数字顺序对剩余行进行排序。如果您想要正常订单而不是倒序,请将-nr
替换为-n
。希望这有助于某人! =)
答案 3 :(得分:3)
如果您使用coverage:py 3.0,则默认情况下会忽略Python目录中的代码,包括标准库和所有已安装的软件包。
答案 4 :(得分:2)
我会这样做:
nosetests --with-coverage --cover-package=foo,bar tests/*
我更倾向于将此解决方案提供给其他建议的人;这很简单但你明确了你希望覆盖哪些包。 Nadia的答案涉及更多冗余打字,Stuart的答案使用sed并仍然通过调用touch __init__.py
创建一个包,并且
--cover-package=.
对我不起作用。
答案 5 :(得分:2)
对于任何尝试使用setup.cfg执行此操作的人,以下操作。我在确定如何指定多个包时遇到了一些麻烦。
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
答案 6 :(得分:1)
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
答案 7 :(得分:0)
您可以改善接受的答案,例如--cover-package=foo,bar