鼻子测试包的组成是什么?

What constitutes a package for nosetests?

我写了一个 "package" -- 我的意思是其中有一个 __init__.py 的目录 -- 名为 ardid:

(master)dbliss@nx3[ardid]> ls
analysis.py   ardid.sh     __init__.pyc    plot_support.py   utils.py
analysis.pyc  goals.py     k_12.png        plot_support.pyc  utils.pyc
ardid.py      goals.pyc    plot_ardid.py   results/
ardid.pyc     __init__.py  plot_ardid.pyc  tests/

如您所见,该软件包包含以下模块

以及目录 tests.

中的测试模块

__init__.py 为空。)

然而,当我 运行 nosetests--cover-package=ardid 时,输出显示只覆盖了 ardid 的几个模块(特别是 ardid , goals, 和 utils):

(master)dbliss@nx3[ardid]> nosetests tests -s --cover-package=ardid --with-coverage
...............
Name             Stmts   Miss  Cover   Missing
----------------------------------------------
ardid.py             0      0   100%   
ardid/ardid.py     108     54    50%   105-254
ardid/goals.py      42     38    10%   52-87, 102-161
ardid/utils.py     437    366    16%   23-26, 30-71, 78, 83-89, 108-110, 113-140, 142-146, 165-166, 168-183, 186-218, 223-285, 288-324, 344, 357-427, 438-441, 443-444, 446-468, 475-480, 483-496, 499, 508-509, 512-513, 516-524, 532, 545-548, 559, 571, 575-576, 581-582, 594-605, 614-615, 618-1018
----------------------------------------------
TOTAL              587    458    22%   
----------------------------------------------------------------------
Ran 15 tests in 11.454s

OK

这是为什么?

请注意,这些并不是我测试的唯一模块:

(master)dbliss@nx3[ardid]> ls tests/
test_plot_support.py  test_plot_support.pyc  test_utils.py  test_utils.pyc

正确的是 ardid 模块导入了 goalsutils,但没有导入其他模块。这是导致 nosetests 仅检测到 goalsutils(除了 ardid)的原因吗?为什么会这样?

我认为答案可能与我在测试模块中导入包模块的方式有关。因为 ardid 模块与包同名,所以我必须用

导入它
from ardid import ardid

(如果我简单地调用

import ardid

包将被导入。)

我导入的其他模块,例如

import utils

nosetests 考虑从 ardid 导入的包 ardid 模块的一部分(来自 ardid 包,而不是模块)。

因此,一个简单的解决方案是将测试模块中的导入更改为

from ardid import X

其中 X 是要测试的模块之一。

@jonrsharpe 在评论中提供了另一个解决方案,如果这个包打算供我以外的任何人使用(并且包含我的解决方案),则该解决方案会更合适。