【问题标题】:Specially named directories using nosetests使用鼻子测试特别命名的目录
【发布时间】:2013-04-23 16:34:33
【问题描述】:

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) 
    

我无法在文档中找到任何关于此的内容。


示例:使用此目录结构:

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

【问题讨论】:

  • 应该很简单。您的测试中有哪些导入?
  • 相当多,而且两种情况下的导入完全相同。您认为特定的导入可能会导致问题吗?如果是这样,为什么目录没有命名src,但不是?
  • 好吧,我没有在目录中用一个简单的测试用例重现它。您的测试中的某些东西(或它们导入的东西)需要 src 模块存在。您能否只留下一个简单的测试,除了 TestCase 类之外没有任何导入,然后再试一次?
  • @AlexanderAfanasiev 我添加了一个示例。不过,其中任何地方都没有提到src。我真的很难过。 :(
  • 我已经在本地创建了提到的目录结构,是的,我已经复制了它。有趣的事实:如果您从根目录中删除 __init__.py - 它会起作用。

标签: python unit-testing import nose nosetests


【解决方案1】:

快速解决方案是从顶级目录中删除__init__.py。另一种选择是使用相对导入,例如:将import a.b 替换为from ...a import b

这种混乱和诡计的罪魁祸首是nose importer

如果你运行nosetests所在的目录是一个包,nose不会将它添加到sys.path,否则,它会添加它(source)。然后,它向上抛出目录树并递归地应用相同的逻辑。所有受影响的文件都是一样的。这解释了为什么它不能与 __init__.py 一起使用 - 根目录(在您的情况下为 src2)不在 sys.path 中 - 这就是为什么找不到包 a 的原因。

但是,这里的悬而未决的问题是:为什么它第一次工作,src 文件夹? 在这种情况下,src 文件夹位于 sys.path 上。可能会有其他答案或编辑。

查看相关问题:

【讨论】:

  • 如果我从 setup.py 使用 setup.py nosetests 运行鼻子测试,我会从 build/lib 中遇到这个问题; build/lib/xxx 有一个 init.py,它的子模块不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2012-08-17
相关资源
最近更新 更多