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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top