124

我似乎无法让鼻子测试框架识别文件结构中我的测试脚本下的模块。我已经设置了演示问题的最简单示例。我会在下面解释。

这是包文件结构:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py 包含:

def dumb_true():
    return True

测试/test_foo.py 包含:

import foo

def test_foo():
    assert foo.dumb_true()

两个init .py 文件都是空的

如果我nosetests -vv在主目录( foo.py 所在的位置)中运行,我会得到:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

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

FAILED (errors=1)

当我从 tests/ 目录中运行时,我得到了同样的错误。根据我发现的文档和示例,nose 应该将所有父包添加到路径以及调用它的目录中,但在我的情况下似乎没有发生这种情况。

我正在使用 Python 2.6.2 运行 Ubuntu 8.04。如果这很重要,我已经手动构建和安装了鼻子(不是使用 setup_tools)。

4

9 回答 9

232

__init__.py的顶级目录中有一个。这使它成为一个包。如果你删除它,你nosetests应该工作。

如果您不删除它,则必须将您的更改import为,您的目录名称在import dir.foo哪里。dir

于 2010-06-18T22:09:39.723 回答
35

你在虚拟环境中吗?就我而言,nosetests是 in 中的一个/usr/bin/nosetests,它正在使用/usr/bin/python. virtualenv 中的包肯定不会在系统路径中。以下解决了这个问题:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
于 2014-03-23T18:37:50.457 回答
14

__init__.py对于那些后来发现这个问题的人:如果我的测试目录中没有文件,我会收到导入错误。

我的目录结构是这样的:

./tests/
  ./test_some_random_stuff.py

如果我进行鼻子测试:

nosetests -w tests

它会给出ImportError其他人看到的。如果我添加一个空白__init__.py文件,它就可以正常工作:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
于 2014-01-23T22:36:32.870 回答
11

另一个潜在问题似乎是目录树中的连字符/破折号。sub-dir我最近通过将目录从重命名为 修复了鼻子 ImportError 问题sub_dir

于 2012-06-15T17:25:04.900 回答
4

当然,如果您在导入的模块中有语法错误,就会导致这种情况。对我来说,当我在与 test.py 相同的目录中备份具有类似 module/tests.bak.py 的路径的测试文件时,问题就出现了。此外,要处理 Django 应用程序中的init包/模块问题,您可以运行以下命令(在 bash/OSX shell 中)以确保周围没有任何init .pyc 文件:

find . -name '*.pyc' -delete
于 2013-05-29T21:55:07.517 回答
4

我收到此错误消息是因为我nosetests从错误的目录运行命令。

愚蠢,但发生了。

于 2016-08-02T19:10:42.380 回答
3

比如下面的目录结构,如果你想在 中运行,nosetests或者在中测试一些功能,你应该使用in 。m1m2m3n.pyfrom m2.m3 import ntest.py

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py
于 2016-07-27T05:14:37.197 回答
2

我刚刚遇到了可能导致此问题的另一件事:以testname.test.py. 这额外的.混淆鼻子并导致它导入它不应该导入的东西。我想很明显,使用非常规的测试命名约定会破坏事情,但我认为这可能值得注意。

于 2015-10-01T23:28:58.480 回答
2

只是为了完成这个问题:如果您正在为这样的结构而苦苦挣扎:

project
├── m1
├    ├── __init__.py
├    ├── foo1.py
├    └──m2
├       ├── __init__.py
├       └── foo2.py
├
└── test
     ├── __init__.py
     └── test.py

也许你想从项目外部的路径运行测试,在你的 PYTHONPATH 中包含你的项目路径。

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

将其粘贴到您的 .profile 中。如果您在虚拟环境下,请将其粘贴到您的 venv root 中的 activate 中

于 2018-05-29T07:22:08.193 回答