python - 在站点包中安装我的 Python 单元测试是否有意义?

标签 python unit-testing installation setuptools software-distribution

我正在开发我的第一个 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/

相关文章:

python - 用户输入调用函数

c# - 如何对 ASP.NET Web 窗体进行单元测试

javascript - 监视 jasmine 中的 jquery ui 小部件

android - 无法使用 Gradle (decard-gradle) 构建测试

cocoa - 如何设置Cocoa项目的安装程序?

css - 如何手动安装 Zurb Foundation?

python - 将包含十六进制行的多类型系列转换为 ascii

python zipfile目录也被复制

python - 将 Python2 文件派生类移植到 Python 3

java - 在 2.6.32-5-xen-amd64 上安装 j2re-1_4_2_19-linux-i586.bin 时出现问题