Python unittest导入问题

时间:2015-02-22 23:23:02

标签: python flask importerror unit-testing

这是我的项目设置:

my_project
    ./my_project
         ./__init__.py
         ./foo
              ./__init__.py
              ./bar.py
         ./tests
             ./__init__.py
             ./test_bar.py

test_bar.py内我有以下import语句: from foo import bar

但是,当我运行python /my_project/tests/test_bar.py时,我收到此错误:

ImportError: No module named foo

有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:9)

想想PYTHONPATH上的内容。项目的顶级包是my_project,因此必须是项目中任何内容导入的开始。

from my_project.foo import bar

您也可以使用相对导入,虽然这不是明确的,如果您更改了执行此导入的模块的相对位置,则会中断。

from ..foo import bar

理想情况下,test文件夹根本不是包,并且不是应用程序包的一部分。请参阅good practices上的pytests页面。这需要您在包中添加setup.py并在开发模式下将其安装到virtualenv。

pip install -e .

不要直接指向应用程序中的文件来运行测试。在正确构建/安装项目之后,使用发现机制来处理您用于为您运行测试的任何框架。例如,使用pytest,只需指向测试文件夹:

pytest tests

或者对于内置的unittest模块:

python -m unittest discover -s tests

答案 1 :(得分:1)

您可以使用相对导入:

from ..foo import bar

https://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

但我也认为使用绝对路径installing你的项目是更好的方式。

答案 2 :(得分:0)

import sys
sys.path.append('/path/to/my_project/')

现在您可以导入

from foo import bar