使用nose的ImportError,使用raw unittest没有ImportError?

时间:2010-05-10 01:19:30

标签: python unit-testing nose

在使用Nose运行我的单元测试时,我得到 ImportError ,而当我独立运行它时,我不会这样做。此处提到的所有文件都可以在http://gist.github.com/395541#看到。

如果我运行测试脚本 importTest-Test.py ,我会直接获得此输出:

C:\usr\x\data\src\Python\mmm>python importTest-Test.py
In mmdb
In BusinessLogic
[]
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

如果我允许Nose运行它,我会收到错误:

C:\usr\x\data\src\Python\mmm>nosetests.exe
E
======================================================================
ERROR: Failure: ImportError (No module named mmdb.DataAccess.AttemptDB)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\bin\installed\python2.6\lib\site-packages\nose-0.11.3-py2.6.egg\nose\loader.py", line 382, in loadTestsFromName
    addr.filename, addr.module)
  File "c:\bin\installed\python2.6\lib\site-packages\nose-0.11.3-py2.6.egg\nose\importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "c:\bin\installed\python2.6\lib\site-packages\nose-0.11.3-py2.6.egg\nose\importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "C:\usr\x\data\src\Python\mmm\importtest-Test.py", line 2, in <module>
    import importtest
  File "C:\usr\x\data\src\Python\mmm\importtest.py", line 1, in <module>
    from mmdb.BusinessLogic.AttemptManager import AttemptManager
  File "C:\usr\x\data\src\Python\mmm\mmdb\BusinessLogic\AttemptManager.py", line 1, in <module>
    from mmdb.DataAccess.AttemptDB import AttemptDB
ImportError: No module named mmdb.DataAccess.AttemptDB

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

在鼻子有困难的包中涉及的文件有以下结构 - 有些可能在这里看到http://gist.github.com/395541#。:

mmm\importtest-Test.py
mmm\importtest.py
mmm\mmdb
mmm\__init__.py
mmm\mmdb\BusinessLogic
mmm\mmdb\BusinessObject
mmm\mmdb\DataAccess
mmm\mmdb\__init__.py
mmm\mmdb\BusinessLogic\AttemptManager.py
mmm\mmdb\BusinessLogic\Collections
mmm\mmdb\BusinessLogic\__init__.py
mmm\mmdb\BusinessLogic\Collections\__init__.py
mmm\mmdb\BusinessObject\__init__.py
mmm\mmdb\DataAccess\AttemptDB.py
mmm\mmdb\DataAccess\__init__.py

这发生在Win32 / Python 2.6 / Nose 0.11.3上。

我会感激任何帮助。

感谢。

4 个答案:

答案 0 :(得分:1)

默认情况下,nose操纵它使用的PYTHONPATH。您可以尝试使用-P开关关闭此行为。

答案 1 :(得分:1)

您可以尝试从顶级文件夹__init__.py中删除mmm (原始答案在这里:https://stackoverflow.com/a/3073368/19166

答案 2 :(得分:0)

您的问题可能是由于文件名中的短划线“ - ”造成的。另见:https://stackoverflow.com/a/11055442/1063605

答案 3 :(得分:0)

这是非常具体的用例的答案,涉及 PyUnit

我在PyDev下运行了一组单元测试。有一天,我输入了一个错误,PyDev为pandas包的一部分添加了一个自动导入。我通常会将代码折叠起来,所以我没有立刻看到它。

测试集后期出现的错误是“错误:无法导入鼻子”。

在调试中,我发现数据文件名中有一个重复的子目录名称。似乎测试运行器正在将工作目录更改为包含.py文件的子目录,但不会返回到项目目录。调用os.path.realpath(“_ file _”)来设置数据文件路径是返回测试子目录而不是预期的项目目录,其结果是未找到数据且测试失败。

“修复”设置数据文件路径的代码解决了此错误。但是,当我回过头来处理剩余的错误时,我发现并删除了不需要的import语句。此时,数据文件路径开始出错,因此我将其更改回原始格式,一切都很好。

所以......如果你发现你突然遇到这些“鼻子”错误,可能是你的编辑无意中引入了一个导致PyUnit失败的导入语句。

我在这里添加了答案,因为我的部分经验是使用原始unittest(来自PyDev上下文菜单)运行各个测试文件,并且对于为什么他们以这种方式工作而感到非常困惑,但不是在完全运行时试验跑步者。