首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python导入使用nose进行测试-导入当前包以上的模块的最佳实践是什么

Python导入使用nose进行测试-导入当前包以上的模块的最佳实践是什么
EN

Stack Overflow用户
提问于 2011-07-13 03:57:40
回答 2查看 21.7K关注 0票数 65

这是一个经常以不同形式被问到的问题,通常得到的回答是“哈哈,你做得不对”。我很确定这是因为人们(包括我)都在尝试使用一个常识场景作为实现,而解决方案并不明显(如果你以前没有这样做过)。

会接受一个“让苍蝇飞出瓶子”的回答。

给定的

代码语言:javascript
复制
project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py

tests_sut.py开始的位置:

代码语言:javascript
复制
import code.sut

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

代码语言:javascript
复制
ImportError: No module named code.sut

走过的道路:

a)使用

代码语言:javascript
复制
from ..code import sut

b)将项目的根添加到PYTHONPATH

c)使用

代码语言:javascript
复制
sys.path.append

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

d)只需记住做一个

代码语言:javascript
复制
setup.py 

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

因此,要求测试位于测试包根目录下,这些测试可以访问项目。以上每一项对我来说都不是“自然”的,都被证明是有问题的,或者看起来像是太难的工作!

在java中,这是可行的,但基本上是借助于构建工具/ IDE将所有类放在类路径中。也许问题是我期待的是Python的“魔力”?在Flask webframework测试中指出,选项d)似乎是首选的。

在任何情况下,下面推荐一个首选解决方案的声明将消除我自己的“不自然”的感觉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-13 04:37:43

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

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

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

代码语言:javascript
复制
import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
票数 12
EN

Stack Overflow用户

发布于 2013-09-18 14:00:42

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6670275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档