繁体   English   中英

Python 导入以使用鼻子进行测试 - 导入高于当前 package 的模块的最佳做法是什么

[英]Python imports for tests using nose - what is best practice for imports of modules above current package

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

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

给定

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

tests_sut.py 开始的地方:

import code.sut

在根目录中运行鼻子测试会导致:

ImportError: No module named code.sut

走过的大道:

a)做一个亲戚使用

from ..code import sut

b) 将项目的根目录添加到 PYTHONPATH

c) 使用

sys.path.append

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

d) 只记得做一个

setup.py 

在项目上将模块安装到站点包中,然后再运行测试。


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

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

无论如何,以下推荐首选解决方案的陈述将消除我自己的“不自然”感觉。

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

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

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

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

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

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

我知道已经检查了一个答案,我仍然认为这是分享其他替代方案的好理由:)

在调用nosestests时,有一个nose-pathmunge可以让您控制设置sys.path

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM