Nosetests导入错误

时间:2014-10-03 08:14:16

标签: python nosetests

我试图使用nosetests在像这样的目录结构中运行我的测试

src
    - file1.py
    - ...
test
    - helper.py
    - test_file1.py

正如您所看到的,test_file1.py有一些测试file1.py的函数,因此它会像这样导入file1.py:

# In file1.py
import file1
import helper

# Tests go here...

我还使用了一个内置了一些简洁功能的helper.py文件,这样我就可以更轻松地创建测试。通过在我的实际代码中扩展几个类并覆盖某些方法来实现此功能。所以helper.py看起来像这样:

# In helper.py 
import file1

# Use stuff in file1.py

我无法理解鼻子如何通过自定义导入程序导入这些内容。我能够通过在src目录中运行nosetest ../tests来获取我的测试文件以导入file1.py,但我目前收到的错误类似于:

File helper.py:
ImportError: cannot import name file1 

鼻子是如何进行导入的?有没有办法让我把它的所有test / src文件整合在一起,这样他们就可以将它们全部导入,同时将它们保存在不同的文件夹中?

2 个答案:

答案 0 :(得分:2)

看到您使用nosetests ../tests执行测试我假设它们是从tests文件夹本身执行的。因此,src目录中的文件不会添加到sys.path,因此会出错。

要解决此问题,可以:

  • 从父目录运行测试 - nosetests将能够自己识别srctest(或tests)目录并将其添加到运行测试前的sys.path

  • 在运行nosetests之前将src目录路径添加到PYTHONPATH(export PYTHONPATH=../src; nosetests

请注意,您也可以省略nose测试的最后一个参数,因为默认情况下它会从当前目录运行测试。否则,如果测试不在您从nosetests启动的目录中,则可以使用--where=<path-to-tests>参数(或简称为-w)定义其位置。例如,您可以从src direcotory执行测试,甚至不设置PYTHONPATH(因为默认情况下将当前目录添加到sys.path),如下所示:nosetests -w ../tests


最后,尽管这本身是非常值得怀疑的,但是:组织Python源代码的最常见方法是让python文件和包直接从项目目录开始,并在“test”子包中进行测试他们测试的包。所以,在你的情况下,它将是:

/file1.py
/test/helper.py
/test/test_file1.py

或更好:

/myproject/__init__.py
/myproject/file1.py
/myproject/test/__init__.py
/myproject/test/helper.py
/myproject/test/test_file1.py

(后者,如果您还在测试源中使用了正确的导入,例如from .. import file1)。

在这种情况下,只需使用nosetests而不用任何参数从项目的根目录运行测试。

无论如何,nosetests足够灵活,可以与任何结构一起使用 - 使用任何更适合你和项目的东西。

有关What is the best project structure for a Python application?

中项目结构的更多信息

答案 1 :(得分:0)

这似乎与鼻子测试中的问题一样:

Importing with Python and Nose Tests

我找到的工作是插入一个try..except块,以便BOTH python和nosetest命令可以在同一目录下工作,如下所示:

(1)在您的主文件中,在其他任何内容之前的最顶部添加:

# In file1.py
   try:
       # This will allow you to do python file1.py inside the src directory
       from file2 import *
       from helper import *
   except:
       # This will allow you to run nosetests in the directory just above
       # the src and test directories.
       from src.file1 import *
       from src.helper import *

(2)在test.py文件中添加:

  from src.file2 import *
  from src.helper import *