Python 鼻测试导入错误

Python 鼻测试导入错误,python,nosetests,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... # In helper.py import file1 # Us

我试图使用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...
# In helper.py 
import file1

# Use stuff in file1.py
我还使用了一个helper.py文件,它内置了一些简洁的功能,这样我可以更轻松地创建测试。这个功能是通过在我的实际代码中扩展几个类并重写一些方法来实现的。因此helper.py看起来像这样:

# In file1.py
import file1
import helper

# Tests go here...
# In helper.py 
import file1

# Use stuff in file1.py
我很难理解nose是如何通过其定制进口商进口这些东西的。通过在src目录中运行
nosetest../tests
,我可以让我的测试文件导入file1.py,但我当前收到一个类似以下的错误:

File helper.py:
ImportError: cannot import name file1 

nose是如何导入的?我有没有办法让它将我的所有测试/src文件集中在一起,这样它们就可以在我将它们保存在单独的文件夹中时相互导入?

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

要解决此问题,可以:

  • 从父目录运行测试-
    nosetests
    将能够自己识别
    src
    test
    (或
    tests
    )目录,并在运行测试之前将它们添加到
    sys.path

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

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


最后,尽管这本身很有问题,但是:组织Python源代码的最常见方法是让Python文件和包直接在项目目录中启动,并在它们测试的包的“测试”子包中进行测试。因此,在您的情况下,它将是:

/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
足够灵活,可以处理任何结构-使用任何看起来更适合您和项目的结构


更多关于项目结构的信息,请参见

这似乎是我在鼻子测试中遇到的一个问题:

我发现的解决方法是插入try..except块,以便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 * 

使用
header.py中的
import src.file1
,或将整个
test
文件夹移动到
src
下,第一个选项不起作用。第二种方法也不管用。看起来实际的测试文件
test\u file1.py
可以导入
file1.py
,但是它导入的帮助文件不能。只是一个愚蠢的问题。为什么要将它们导入为
file1.py
,而不是
file1
?啊,对不起,这只是一个输入错误。我会修好的!谢谢您的第一个建议是,在阅读文档之后,我假设鼻测试是如何工作的。但是,当my
tests
目录中的测试导入其他测试装置/文件和src文件时,就会出现问题。Nosetests会变得混乱,要么让我导入其他测试模块,要么让我导入src文件,但不是两者都导入。是的,这就是重点-通常,如果您从父目录运行到“src”和“test”,Nosetests会让您这样做。在这种情况下,nosetests将同时添加到sys.path中,其中一个通常能够从测试和其他测试导入源。在任何情况下,如果这仍然不起作用-我建议从各种测试中打印sys.path并检查它是否存在“异常”。更糟糕的情况是,可以导出PYTHONPATH以强制将某些目录添加到sys.path。(虽然,我认为更合适的方法是建立一个对nose有好处的direcotry结构)。第二个要点“export PYTHONPATH=./”解决了我的问题,现在在运行nosetests时,子目录可以“看到”彼此。