我试图使用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文件整合在一起,这样他们就可以将它们全部导入,同时将它们保存在不同的文件夹中?
答案 0 :(得分:2)
看到您使用nosetests ../tests
执行测试我假设它们是从tests
文件夹本身执行的。因此,src
目录中的文件不会添加到sys.path
,因此会出错。
要解决此问题,可以:
从父目录运行测试 - nosetests
将能够自己识别src
和test
(或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 *