Python使用nose导入测试 - 对于当前包上面的模块导入,最佳做法是什么

时间:2011-07-12 19:57:40

标签: python testing nose python-import

这是一个经常以不同形式提出的问题,并经常得到“大声笑你没有做好”的回答。很确定这是因为人们(包括我)正在尝试使用它作为一种实现的常识场景,并且解决方案并不明显(如果你之前没有这样做过)。

接受一个“让飞出瓶子”的答案。

鉴于

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py

test_sut.py开始的地方:

import code.sut

在根目录中运行nosetests会导致:

ImportError: No module named code.sut

走过的路:

a)使用

做亲戚
from ..code import sut

b)将项目的根添加到PYTHONPATH

c)使用

sys.path.append

在每个测试模块开始时在导入之前添加..路径。

d)只记得做一个

setup.py 

在项目上,在运行测试之前将模块安装到site-packages中。


因此,要求是在测试包根目录下面有可以访问项目的测试。上面的每一个对我来说都不是“自然的”,已经证明有问题或者看起来太辛苦了!

在java中这是有效的,但基本上是通过构建工具/ IDE将所有类放在类路径上。也许问题是我期待Python的“魔力”?在Flask webframework测试中已经注意到,选项d)似乎是首选。

在任何情况下,以下陈述推荐首选解决方案的陈述都会消除我自己的“不自然”感。

3 个答案:

答案 0 :(得分:44)

我遇到了同样的问题,发现相关问题中的answer对我有用。

  

只需删除项目根目录中的__init__.py即可。

答案 1 :(得分:10)

你已经很好地回答了你的问题.. D(安装到系统位置)是可分发代码的首选。我通常使用C(修改sys.path),因为我不希望系统安装我的数百个自定义库。理论上A(相对导入)似乎更好,但有些情况下它失败了。 B(PYTHONPATH)就出来了,我认为真的只是出于测试目的。

这几乎总结了所有选项。您喜欢的选项(Python神奇地知道在哪里查看)实际上不是一个可行的解决方案,因为它可能导致不可预测的结果,例如从不相关的项目中自动查找库。

在我看来,最好的办法是把它放在你的程序的入口点:

import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path

答案 2 :(得分:4)

我知道有一个答案已经检查过,我仍然认为这是分享其他选择的一个很好的理由:)

在调用sys.path时,有一个nose-pathmunge为您提供设置nosestests的控件。