我正在为单元测试设置一些代码。我的目录目前看起来像这样:
project/
src/
__init__.py
sources.py
test/
__init__.py
sources_test.py
在__init__.py中,对于测试目录,我有以下两行:
import sys
sys.path.insert(0, '../')
在测试文件中,我有一行import src.sources
。
当我使用nose从项目目录运行这些测试时,一切正常。如果我尝试单独运行测试,它会给我这个错误:
ImportError: No module named src.sources
我认为这是因为当我从命令行运行测试时它没有使用__init__.py。有没有办法确保即使我尝试单独运行测试也会使用这些行?
我可以从__init__.py中取出行并将它们放入我的测试文件中,但我试图避免这样做。
要单独运行测试,我正在运行python sources_test.py
答案 0 :(得分:1)
你真的试图在这里滥用包裹,这不是一个好主意。
简单的解决方案是不在tests
目录中运行测试。只需打上一个级别,然后执行python tests/sources_test.py
。
当然,这本身并不会导入test/__init__.py
。为此,您确实需要导入包。所以python -m tests.sources_test
可能是一个更好的主意......当然,除非你的软件包是作为脚本运行但不能导入的,否则它将不起作用。
或者,你可以(至少在POSIX平台上)从PYTHONPATH=.. python sources_test.py
内做tests
。这有点hacky,但它应该工作。
或者,更好的是,结合上述内容,并从tests
之外做PYTHONPATH=. python tests/sources_test.py
。
真正的hacky解决方法是明确import __init__
。这应该基本上适用于您的简单用例,但一切都错了 - 特别是,您最终得到一个名为__init__
的模块,而不是一个名为test
的模块,当然您的主模块不是名为test.sources_test
,实际上根本没有test
个包。除非您在修改sys.path
后意外重新导入任何内容,否则您可能会获得模块的重复。
答案 1 :(得分:0)
如果你写
import src.source
python解释器在src目录中查找__init__.py
文件。如果存在,则可以将该目录用作包名。如果你不在你的项目目录中,这是你在src
目录中的情况,那么python会查看$PYTHONPATH
环境变量中的目录(至少在linux中,windows也应该有一些环境变量,可能有另一个名称),如果它可以找到一个带有__init__.py
文件的目录src。
你设置了$PYTHONPATH
吗?