我正在开发我的第一个 Python 分发包。我的学习曲线 Python 打包似乎有点趋于平稳,但我仍在努力 几个悬而未决的问题。一个是我是否应该让我的单元测试成为 与我的代码一起安装。
我明白了it's important to include tests in a source distribution .我想知道我是否应该实际配置它们以进行安装?
我至少见过一个似乎故意这样做的流行软件包 ( PyHamcrest ),以及至少一个似乎是无意中这样做的 (behave)。
所以我的(多部分)问题是这样的:
将我的包单元测试与我的包一起安装是否有意义? 包码?
如果是这样,用例是什么?谁会使用它们?为了什么?也就是说,谁 会使用那些不太乐意下载源代码的人 分发并运行
python setup.py test
?他们将如何使用已安装的单元测试?像
导入测试; test.run()
之类的 像这样?
最佳答案
在我看来,正确的答案是否定的,但您会发现很多安装测试的发行版。不应安装测试,但应将它们包含在源代码分发中。在我看来,在理想情况下,测试已安装的包应该由包管理器 (pip) 执行,site-packages
目录不应被测试源污染。
我最近研究了这个主题并从各种来源收集了信息,并找到了几种不同的方法来构建包含库源和测试的发行版的目录/包层次结构。这些结构中的大多数似乎已经过时,它们的发明是为了解决当时旧分布系统不完整的功能集。不幸的是,许多在线资源(较旧的博客文章/文档)仍在宣传过时的方法,因此通过在线搜索很容易找到过时的分发指南/教程。
假设您有一个名为“my_lib”的库,并且您想要构建分发的源代码。我将展示两种流行但看似过时的方式来构建您的发行版,以及我发现最通用的第三种方式。第三种方法也可能已过时,但这是我在发布此答案时所知道的最好的方法。 ;-)
方法#1
(有意或无意)安装测试的发行版通常使用此方法。
层次结构
+- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
| +- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
方法#2
测试未安装,但它们应通过 MANIFEST.in
文件包含在源代码分发中。
层次结构
+- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
+- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
方法#3(我更喜欢这个。)
这与方法 #2 非常相似,只是稍作改动(src
目录)。
层次结构
+- src
| +- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
+- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
setup() 在 setup.py 中调用
from setuptools import setup, find_packages
setup(
...
packages=find_packages('src'),
package_dir={'': 'src'},
...
)
MANIFEST.in
recursive-include tests *.py
不会安装测试,但它们会通过我们的 MANIFEST.in
包含在源代码分发中。
在方法#3 的情况下,您有一个 src
目录,该目录通常只包含一个包,它是您的 lib 的根目录。将 my_lib
包放入 src
目录(目录而不是包,因此您不需要 src/__init__.py
)具有以下好处:
- 当您执行
setup.py
时,包含setup.py
的目录会隐式添加到 python 路径中。这意味着在您的setup.py
中,如果它的包与setup.py
位于同一目录中,您可能会意外和不正确地从您的库中导入内容。通过将my_lib
包放入src
我们可以避免这个问题。 您可以轻松地使用分布式测试源来测试分布式库源和已安装的库:
- 当您使用
setup.py test
运行测试时,您的setup()
的package_dir={'': 'src'}
部分> 调用保证您的测试将看到您保存在src/my_lib
中的my_lib
库包。 - 您也可以在没有
setup.py
的情况下运行测试。在最简单的情况下,您可以使用python -m unittest
命令来完成。在这种情况下,src
目录不会成为 python 路径的一部分,因此您可以使用此方法测试库的安装版本,而不是src
中的源代码。
- 当您使用
关于python - 在站点包中安装我的 Python 单元测试是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454744/