stackoverflow上有很多帖子询问python项目的目录结构。甚至有人问到测试文件应该去哪里。但是,我没有找到一个解决从源代码发布中实际运行测试的问题。
假设我有一个名为myproject的python项目。源代码分发会像这样
myproject-source-dir
|README.txt
|LICENSE.txt
|NEWS.txt
|setup.py
|myproject
-|__init__.py
-|mymodule.py
假设mymodule
定义了当用户导入myproject时我想要提供的内容:
# myproject/mymodule.py
def useful_thing(...):
<do stuff>
我可以通过将useful_thing
导入myproject/__init__.py
的项目名称空间来使# myproject/__init__.py
from myproject.mymodule import useful_thing
可用:
import myproject
myproject.useful_thing(...)
安装项目后,myproject位于系统路径中,用户可以
myproject-source-dir
|README.txt
|LICENSE.txt
|NEWS.txt
|setup.py
|myproject
-|__init__.py
-|mymodule.py
|test
-|test_mymodule.py
所以到目前为止一切都很简单。现在假设我们添加测试
test/test_mymodule.py
# test/test_mymodule.py
from myproject import useful_thing
肯定想从mymodule中导入有用的东西
# test/test_mymodule.py
from myproject import mymodule
或者
myproject
问题在于,在安装代码之前,from myproject import ...
不在python系统路径中,因此myproject-source-dir
不起作用。这意味着每次我想运行测试时,我都必须先安装软件包。这似乎不对。
问:从源代码分发中运行测试的正确方法是什么?
注意:测试目录是myproject
的子目录还是from myproject import ...
的子目录不会改变{{1}}赢得的事实开箱即用。
答案 0 :(得分:3)
我知道的许多源代码分发通过相对添加上层目录级别作为第一项修改模块搜索路径sys.path
,以使Python找到源树而不是模块/应用程序的已安装版本测试。
考虑这个结构:
/test/
test_app.py
/app/
__init__.py
foo.py
/README.txt
在/test/test_app.py
中,您可以导入app
:
sys.path.insert(0, os.path.abspath('..'))
from app import Foo
然后测试Foo
。你可能想看看https://bitbucket.org/jgehrcke/gipc/src,这是我在一个非常简单的项目中使用这个习语的地方。