我可以将鼻子覆盖输出限制到目录(而不是包)吗?
-
21-08-2019 - |
题
我的 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
不在
包。(请参阅后面的线程http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html由于我不将它们放入包裹中的原因。)
我可以将覆盖输出限制为仅 foo.py 和 bar.py 吗?
更新 - 假设没有更好的答案 纳迪亚在下面,我问了一个后续问题: “如何编写一些(bash)shell 脚本将目录中所有匹配的文件名转换为命令行选项?”
解决方案
你可以这样使用它:
--cover-package=foo --cover-package=bar
我快速浏览了一下鼻子源代码以确认: 这是这条线
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
其他提示
您可以使用:
--cover-package=.
,甚至设置的环境变量
NOSE_COVER_PACKAGE=.
与鼻子1.1.2测试
我有很多顶级 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"
笔记:
- 这是来自我的 .bashrc 文件。如果不使用bash则适当修改。
- 这些必须从您的顶级目录运行。否则,包名称将不正确,并且覆盖范围将无法处理它们(即它不会告诉您您的 --cover-package 不正确,而是会表现得好像您根本没有提供该选项)。
- 我目前在 Ubuntu 13.10 上使用 Python 2.7.6,nose 版本为 1.3.0,coverage 版本为 3.7.1。这是我测试这些命令的唯一设置。
- 在您的使用中,如果 --cover-erase 和 --cover-inclusive 不符合您的需求,请删除它们。
- 如果您想按正常顺序而不是逆序排序,请替换
-nr
和-n
在排序命令中。 - 这些命令假设所有顶级 Python 文件/包的命名都不带点(“.py”中的点除外)。如果您的情况并非如此,请阅读下面的详细信息部分以了解命令部分,然后根据需要修改命令。
细节:
我并不声称这些是实现我想要的结果的最有效的命令。它们只是我碰巧想出的命令。=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
.
希望这对某人有帮助!=)
如果您使用覆盖:PY 3.0 时,然后在Python代码目录是在默认情况下忽略,包括标准库和所有安装的软件包。
我这样做:
nosetests --with-coverage --cover-package=foo,bar tests/*
我喜欢这个解决他人建议;这是简单而你明确了解哪些包,你希望有覆盖。 Nadia的答案涉及了很多的冗余输入,斯图尔特的回答使用SED,仍然通过调用touch __init__.py
创建一个包,
--cover-package=.
不会为我工作。
对于任何试图与setup.cfg要做到这一点,以下的作品。我遇到了一些麻烦搞清楚如何指定多个包。
[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