20

我的 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 吗?

更新- 假设没有比下面Nadia更好的答案,我问了一个后续问题:“我如何编写一些(bash)shell 脚本来将目录中所有匹配的文件名转换为命令行选项? "

4

8 回答 8

22

你可以像这样使用它:

--cover-package=foo --cover-package=bar

我快速查看了鼻子源代码以确认:这是行

    if options.cover_packages:
        for pkgs in [tolist(x) for x in options.cover_packages]:
于 2009-05-12T22:23:05.487 回答
15

您可以使用:

--cover-package=.

甚至设置环境变量

NOSE_COVER_PACKAGE=.

用鼻子测试 1.1.2

于 2011-10-07T18:58:42.803 回答
4

我有很多顶级 Python 文件/包,并且发现使用 --cover-package 手动列出它们很烦人,所以我为自己做了两个别名。Aliasnosetests_cover将覆盖 --cover-package 中列出的所有顶级 Python 文件/包。Aliasnosetests_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,请适当修改。
  • 这些必须从您的顶级目录运行。否则,包名称将不正确,coverage 将默默地无法处理它们(即,它不会告诉您您的 --cover-package 不正确,它会表现得就像您根本没有提供该选项一样)。
  • 我目前在 Ubuntu 13.10 上使用 Python 2.7.6,鼻子版本 1.3.0 和覆盖版本 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-- 加入标准错误和标准输出。
  • | fgrep '%'-- 删除所有没有%字符的输出行。
  • | sort -nr -k 4-- 按第 4 列(即覆盖百分比列)以相反的数字顺序对剩余的行进行排序。如果您想要正常顺序而不是反向顺序,请替换-nr-n.

希望这对某人有帮助!=)

于 2014-03-26T22:44:04.397 回答
3

如果使用coverage:py 3.0,则默认忽略 Python 目录中的代码,包括标准库和所有已安装的包。

于 2009-05-12T23:10:06.953 回答
2

我会这样做:

nosetests --with-coverage --cover-package=foo,bar tests/*

我更喜欢这个解决方案而不是其他建议的解决方案;这很简单,但您明确说明您希望覆盖哪些包。Nadia 的回答涉及更多冗余输入,Stuart 的回答使用 sed 并且仍然通过调用创建一个包touch __init__.py,并且 --cover-package=.对我不起作用。

于 2013-04-19T09:54:24.143 回答
2

对于尝试使用 setup.cfg 执行此操作的任何人,以下内容有效。我在弄清楚如何指定多个包时遇到了一些麻烦。

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
于 2015-09-03T13:47:08.890 回答
1
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
于 2011-06-08T01:11:45.677 回答
0

您可以像这样改进接受的答案--cover-package=foo,bar

于 2016-06-03T17:46:00.113 回答