nosetests
对某些名称的目录进行区别对待吗? src
目录特别吗?
如果我有一个源目录名为src
的项目,nosetests
似乎工作正常。但是,如果目录以其他任何名称命名,nosetests
会报告一堆导入错误。
这就是我的所作所为:
运行测试
~/src$ nosetests
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
重命名目录
~/src$ cd ..
~/$ mv src/ src2
重新运行测试
~/$ cd src2
~/src2$ nosetests
E
======================================================================
ERROR: Failure: ImportError (No module named **whatever**)
----------------------------------------------------------------------
Traceback (most recent call last):
... etc. ...
import **whatever**
ImportError: No module named **whatever**
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
我无法在文档中找到任何关于此的内容。
示例:使用此目录结构:
.
|-- a
| |-- b.py
| `-- __init__.py
|-- __init__.py
`-- test
|-- a
| |-- __init__.py
| `-- testb.py
`-- __init__.py
所有__init__.py
个文件都为空,a/b.py
的内容为:
y = 3
和test/a/testb.py
:
import a.b
import unittest as u
class TestB(u.TestCase):
def test1(self):
self.assertTrue(True)
def test2(self):
self.assertTrue(False)
我可以可靠地重现这个问题。正在运行nosetests -V
会:
nosetests version 1.2.1
答案 0 :(得分:3)
快速解决方案是从顶级目录中删除__init__.py
。另一个选择是使用相对导入,例如:将import a.b
替换为from ...a import b
。
这种混乱和棘手的罪魁祸首是nose importer。
如果您正在运行的目录nosetests
是一个包,则不会将其添加到sys.path
,否则,它会添加它(source)。然后,它向上抛出目录树并递归地应用相同的逻辑。所有受影响的文件都是一样的。这解释了为什么它不能使用__init__.py
- root dir(在你的情况下为src2
)不在sys.path中 - 这就是找不到包a
的原因。
但是,这里的开放性问题是:为什么它第一次使用src
文件夹?
在这种情况下,src
文件夹位于sys.path上。可能会有其他答案或编辑。
参见相关问题: