【问题标题】:ImportError using nose, no ImportError using raw unittest?ImportError 使用鼻子,没有 ImportError 使用原始单元测试?
【发布时间】:2010-05-10 01:19:30
【问题描述】:

我在使用 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)

nose 遇到困难的包中涉及的文件具有以下结构 - 有些可以在这里看到 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 上。

如果有任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

  • 你有没有发现你的问题?我遇到了一个非常相似的问题,但无法解决。

标签: python unit-testing nose


【解决方案1】:

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

【讨论】:

  • 非常感谢您的回复,非常感谢。不幸的是,当我执行“nosetests.exe -P”时,输出与以前相同
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    看起来您的问题可能是由于文件名中的破折号“-”造成的。另见:https://stackoverflow.com/a/11055442/1063605

    【讨论】:

      【解决方案4】:

      这是一个涉及 PyUnit非常具体的用例的答案。

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

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

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

      “修复”设置数据文件路径的代码解决了这个错误。但是,当我通过剩余的错误返回时,我发现并删除了不需要的导入语句。那个时候数据文件路径开始报错,所以我把它改回原来的形式,一切都很好。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        相关资源
        最近更新 更多