使用nosetests特别命名的目录

时间:2013-04-23 16:34:33

标签: python unit-testing import nose nosetests

nosetests对某些名称的目录进行区别对待吗? src目录特别吗?

如果我有一个源目录名为src的项目,nosetests似乎工作正常。但是,如果目录以其他任何名称命名,nosetests会报告一堆导入错误。

这就是我的所作所为:

  1. 运行测试

    ~/src$ nosetests
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK
    
  2. 重命名目录

    ~/src$ cd ..
    ~/$ mv src/ src2
    
  3. 重新运行测试

    ~/$ 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) 
    
  4. 我无法在文档中找到任何关于此的内容。


    示例:使用此目录结构:

    .
    |-- 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
    

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上。可能会有其他答案或编辑。

参见相关问题: