6

使用 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

4 回答 4

1

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

于 2010-05-10T04:21:13.773 回答
1

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

于 2011-12-20T07:51:34.760 回答
0

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

于 2013-08-12T18:03:18.183 回答
0

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

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

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

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

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

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

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

于 2017-08-29T01:21:43.647 回答