Python 使用nosetest的特殊命名目录
Python 使用nosetest的特殊命名目录,python,unit-testing,import,nose,nosetests,Python,Unit Testing,Import,Nose,Nosetests,nosetests是否以不同的方式对待具有特定名称的目录?src目录是否特殊 如果我有一个源目录名为src的项目,nosetests似乎可以正常工作。但是,如果目录名为其他名称,nosetests会报告一系列导入错误 以下是我所做的: 运行测试 ~/src$ nosetests .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK 重命名目录 ~/
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
所有\uuuu init\uuuu.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
快速解决方案是从顶级目录中删除
\uuuu init\uuuu.py
。另一个选项是使用相对导入,例如:将import a.b
替换为from…a import b
这种混乱和诡计的罪魁祸首是
如果您运行的目录是一个包,那么nose不会将其添加到sys.path
,否则,它会将其添加()。然后,它进入抛出目录树并递归应用相同的逻辑。对所有受影响的文件也是如此。这解释了为什么它不能与\uuu init\uuu.py
-根目录(src2
)不在sys.path中-这就是为什么找不到包a
但是,这里的开放性问题是:为什么它第一次在src
文件夹中工作?
在这种情况下,src
文件夹位于sys.path上。可能会有其他答案或编辑
见相关问题:
src
,而不是命名为src呢?好吧,我没有在目录中用一个简单的测试用例复制它。测试中的某些内容(或它们导入的smth)需要src
模块存在。你能不能只留下一个简单的测试,除了TestCase
class之外,不进行任何导入,然后再试一次?@AlexanderAfanasiev我添加了一个例子。不过,在它的任何地方都没有提到src
。我真的被难住了(我已经在本地创建了提到的目录结构,是的,我复制了它。有趣的事实是:如果从根目录中删除\uu init\uuu.py
,它就会工作。如果我从setup.py和setup.py运行nosetest,我会从build/lib中遇到这个问题;build/lib/xxx有一个init.py,它的子模块不工作。