我可以将鼻子覆盖范围输出限制到目录(而不是包裹)吗?

时间:2009-05-12 22:06:29

标签: python code-coverage nose nosetests

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

8 个答案:

答案 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"

注意:

  • 这是来自我的.bashrc文件。如果您不使用bash,请进行适当修改。
  • 这些必须从您的顶级目录运行。否则,包名称将是不正确的,并且覆盖范围将无声地处理它们(即,而不是告诉您--cover-package不正确,它将表现得像你根本没有提供选项)。
  • 我目前在Ubuntu 13.10上使用Python 2.7.6,鼻子版本为1.3.0,覆盖版本为3.7.1。这是我测试这些命令的唯一设置。
  • 在您的使用中,如果他们不符合您的需求,请删除--cover-erase和--cover-inclusive。
  • 如果要按正常顺序排序而不是按逆序排序,请在排序命令中将-nr替换为-n
  • 这些命令假定您的所有顶级Python文件/包的名称都没有点(除了#34; .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

希望这有助于某人! =)

答案 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