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

leo*_*mig 64 python testing nose python-import

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

会接受一个"让飞出瓶子"的答案.

特定

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py
Run Code Online (Sandbox Code Playgroud)

tests_sut.py开始的位置:

import code.sut
Run Code Online (Sandbox Code Playgroud)

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

ImportError: No module named code.sut
Run Code Online (Sandbox Code Playgroud)

旅行途径:

a)做亲戚使用

from ..code import sut
Run Code Online (Sandbox Code Playgroud)

b)将项目的根添加到PYTHONPATH

c)使用

sys.path.append
Run Code Online (Sandbox Code Playgroud)

在每个测试模块的开头导入之前添加..路径.

d)只记得做一个

setup.py 
Run Code Online (Sandbox Code Playgroud)

在项目上,在运行测试之前将模块安装到站点包中.


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

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

在任何情况下,下面的陈述推荐一个首选的解决方案将消除我自己的"不自然"的感觉.

cnu*_*cnu 44

我遇到了同样的问题,并在相关问题中找到了答案.

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

  • 很棒的答案!我有一个旧的\ _ _ _ init\_\_..pyc遗留下来导致我这个问题. (8认同)
  • 这对我没有帮助,这应该如何解决? (2认同)

Luk*_*uke 11

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

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

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

import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
Run Code Online (Sandbox Code Playgroud)


Dra*_*uan 5

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

有一个鼻子路径,让您sys.path在调用nosestests.