0

我正在为单元测试设置一些代码。我的目录目前如下所示:

project/
    src/
        __init__.py
        sources.py
    test/
        __init__.py
        sources_test.py

在测试目录的 __init__.py 中,我有这两行:

import sys
sys.path.insert(0, '../')

在测试文件中,我有import src.sources.

当我使用鼻子从项目目录运行这些测试时,一切正常。如果我尝试单独运行测试,它会给我这个错误:

ImportError: No module named src.sources

我认为这是因为当我从命令行运行测试时,它没有使用 __init__.py。有没有一种方法可以确保即使我尝试单独运行测试也会使用这些行?

我可以从 __init__.py 中取出这些行并将它们放入我的测试文件中,但我试图避免这样做。

要单独运行测试,我正在运行python sources_test.py

4

2 回答 2

1

你真的想在这里滥用包,这不是一个好主意。

简单的解决方案是不在tests目录中运行测试。只需 cd 上一级,然后执行python tests/sources_test.py.

当然,这本身不会 import test/__init__.py。为此,您确实需要导入包。所以python -m tests.sources_test可能是一个更好的主意……当然,除了如果你的包是作为脚本运行而不是被导入的,那是行不通的。

或者,您可以(至少在 POSIX 平台上)PYTHONPATH=.. python sources_test.pytests. 这有点hacky,但它应该可以工作。

或者,更好的是,将上述内容结合起来,然后从 外部tests执行PYTHONPATH=. python tests/sources_test.py

一个真正 hacky 的解决方法是显式地import __init__. 这应该基本上适用于您的简单用例,但一切都以错误告终——特别是,您最终得到一个名为的模块__init__而不是一个名为的模块test,当然您的主模块不是命名test.sources_test的,实际上没有test包全部。除非你在修改后不小心重新导入了任何东西sys.path,在这种情况下你可能会得到模块的重复。

于 2013-05-07T20:45:09.427 回答
0

如果你写

import src.source

python 解释器在 src 目录中查找__init__.py文件。如果存在,您可以使用该目录作为包名。如果你不在你的项目目录中,当你在src目录中时,python会查看$PYTHONPATH环境变量中的目录(至少在linux中,windows也应该有一些环境变量,可能有另一个名字),如果它可以找到一些包含__init__.py文件的目录 src。你设置了$PYTHONPATH吗?

于 2013-05-07T20:44:58.517 回答