如果我不使用我的包裹分发它们,如何组织我的pytest测试?

时间:2015-11-27 20:19:36

标签: python-2.7 pytest software-distribution

作为suggested in the pytest documentation,我设置了我的包,其目的不是将我的测试与我的包一起分发:

setup.py
mypkg/
    __init__.py
    mypkg/
      appmodule.py  
tests/
    test_app.py
    ...

但我对如何确保这些测试在存在时正确运行感到困惑(例如,在Travis CI或项目目录的克隆中)。

我希望我的测试脚本中的导入应用于相邻mypkg/目录中的源(而不是mypkg中可能安装的任何site-packages),但是我我得到的错误令我感到困惑。

如果我按照pytest文档中的建议操作,并且未在__init__.py中添加tests/,那么

from __future__ import absolute_import
from mypkg.appmodule import * 

我得到了

  

ImportError:没有名为mypkg.appmodule的模块

from __future__ import absolute_import
from ..mypkg.appmodule import * 

我得到了

  

ValueError:在非包中尝试相对导入

如果我忽略文档并包含__init__.py,那么后者我会得到

  

ValueError:尝试超出顶级包

的相对导入

仅包含__init__.py并使用

from __future__ import absolute_import
from mypkg.appmodule import * 

我的测试会运行吗?但我不清楚,如果mypkg/中安装了mypkg,这将从相邻的site-packages目录导入来源。

组织我的pytest测试的正确方法是什么,以便它们与我的项目源分开 - 而不是与我的项目源一起分发,但始终导入相邻的源,而不是安装elswehere的软件包的版本?

1 个答案:

答案 0 :(得分:1)

问题是当你要求它在mypkg目录中查找不存在时,python找不到你的appmodule。

您已正确设置目录:

setup.py
mypkg/
    __init__.py
    mypkg/
        appmodule.py  
tests/
    test_app.py
    ...

但是既然你已经创建了另一个mypkg /子目录来存放appmodule.py,你需要在该子目录中放置__init__.py以便导入工作。该呼叫也将更改为:

from mypkg.mypkg.appmodule import *

希望这有帮助。