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

2023-12-19

我正在开发我的第一个 Python 发行包。我的学习曲线 Python 打包似乎有点趋于平稳,但我仍在努力解决 一些悬而未决的问题。一是我是否应该让我的单元测试 与我的代码一起安装。

我明白在源代码分发中包含测试很重要 https://stackoverflow.com/questions/14436912/what-are-the-use-cases-for-a-python-distribution。我想知道我是否应该实际配置它们来安装?

我至少见过一个流行的软件包似乎是故意这样做的 (皮汉克雷斯特 https://github.com/hamcrest/PyHamcrest),并且至少有一个人似乎是无意中这样做的 (behave https://github.com/jeamland/behave).

所以我的(多部分)问题是这样的:

  • 将我的包单元测试与我的包一起安装是否有意义? 封装代码?

  • 如果是这样,用例是什么?谁会使用它们以及用途是什么?也就是说,谁 会使用它们,但不会完全乐意下载源代码 分发和运行python setup.py test反而?

  • 他们将如何使用已安装的单元测试?喜欢import 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 file.

等级制度

+- my_lib
|  +- __init__.py
|  +- source1.py
|  +- source2.py
+- tests
|  +- __init__.py
|  +- test_1.py
|  +- test_2.py
+- setup.py

方法#3(我更喜欢这个。)

这与方法 #2 非常相似,但有一点不同(src dir).

等级制度

+- src
|  +- my_lib
|     +- __init__.py
|     +- source1.py
|     +- source2.py
+- tests
|  +- __init__.py
|  +- test_1.py
|  +- test_2.py
+- setup.py

setup.py 中的 setup() 调用

from setuptools import setup, find_packages

setup(
    ...
    packages=find_packages('src'),
    package_dir={'': 'src'},
    ...
)

清单文件

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 the package_dir={'': 'src'}你的一部分setup()调用保证你的测试会看到你的my_lib您保存的库包src/my_lib.
    • 您也可以运行测试而无需setup.py。在最简单的情况下,您可以使用python -m unittest命令。在这种情况下srcdir 不会成为 python 路径的一部分,因此您可以使用此方法来测试库的已安装版本而不是源src.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在站点包中安装 Python 单元测试是否有意义? 的相关文章

随机推荐

  • 从 Excel 复制后剪贴板中出现奇怪的内容

    我正在尝试使用以下方法获取应用程序中剪贴板的内容以确保 Excel 兼容性 Clipboard clipboard new Clipboard Display getDefault String contents String clipbo
  • 什么是 NSAssert1?

    我正在 iOS 上开发一个应用程序 我看到有一个宏叫做NSAssert1 它是做什么用的 两者在使用上有什么区别NSLog and NSAssert1 请指导我或建议我可以阅读的教程 NSAssert变体接受一个条件和一条消息 如果条件不满
  • 从 C# 托管代码调用 win32 CreateProfile()

    快速问题 希望如此 如何从 C 托管代码 正确调用 win32 函数 CreateProfile 我尝试自行设计解决方案 但没有成功 CreateProfile 的语法是 HRESULT WINAPI CreateProfile in LP
  • 将 iframe 添加到 JSF 组件

    是否可以从支持 bean 将 iframe 添加到 JSF 组件 RichFaces PrimeFaces 我需要在我的主页中嵌入外部网页 用户需要设置这个url 我无法使用 jQuery 我无法找到任何 iframe 等效的 JSF 组件
  • Yarn MapReduce 作业问题 - Hadoop 2.3.0 中的 AM 容器启动错误

    我已经设置了 Hadoop 2 3 0 的 2 节点集群 它工作正常 我可以成功运行 Distributedshell 2 2 0 jar 示例 但是当我尝试运行任何 MapReduce 作业时 我收到错误 我已经设置了 MapRed xm
  • 在 PHP 中将一种日期格式转换为另一种日期格式

    PHP 中是否有一种简单的方法将一种日期格式转换为另一种日期格式 我有这个 old date date y m d h i s works middle strtotime old date returns bool false new d
  • 查找支持的 GLSL 版本

    如何以一种可以可靠地以编程方式使用的方式找到 OpenGL 实现支持的 GLSL 版本 是获得的最好方法GL SHADING LANGUAGE VERSION字符串并尝试解析它 是否可以可靠地以明确定义的格式返回 我的英特尔驱动程序返回1
  • 将 ROR 应用程序部署到无法访问 Internet 的计算机

    我完成了一个简单的 Ror hello world 应用程序 现在我面临的问题是如何将其部署到另一台物理上无法连接到 Internet 的 Windows 计算机 我可以通过 USB 复制文件和应用程序 但是我怎样才能将 gem 安装到该机
  • PHP 字符串反转而不使用额外内存

    如何在不使用任何额外内存变量的情况下将 str hello n 反转为 olleh n 我查找了预构建的函数 但它们都使用内存 而且 我认为字符串是不可变的 所以基本上可以在不进行任何调整的情况下完成此操作 或者创建新字符串是唯一的选择吗
  • R随机森林:数据(x)有0行

    我在用randomForestrandomForest 包中的函数查找最重要的变量 我的数据框称为城市 我的响应变量是数字收入 urban random forest lt randomForest revenue y urban reve
  • Lex 正则表达式获得一些额外的字符

    我的 lex 文件中有以下定义 L a zA Z A a zA Z 0 9 L A yylval id yytext return IDENTIFIER 我在 YACC 文件中执行以下操作 primary expression IDENTI
  • Express.js 请求体 __proto__

    我对由express urlencoded 中间件生成的request body有一个小问题 在某些情况下它会添加 proto 在 request body 对象的末尾 并且不能像这样直接使用它来启动 Moongose 模型var user
  • Android应用程序更新[重复]

    这个问题在这里已经有答案了 可能的重复 Android 上有没有办法自动更新应用程序 https stackoverflow com questions 3057771 is there a way to automatically upd
  • sizeof(T)== sizeof(const T)和alignof(T)==alignof(const T)吗

    假设似乎是合理的T and const T将是两种大小相同且对齐方式相同的类型 但在考虑了一些实际系统之后 它们似乎可能不同 让我解释 假设您的系统有两种类型的内存 RAM 和闪存 只读 RAM 是 8 位可寻址的 而 Flash 只能是
  • “生产”环境缺少“secret_token”和“secret_key_base”

    我看到了这个解决方案的所有答案 但没有一个对我有用 1 我的配置部署等于这个DigitalOcean 的教程 https www digitalocean com community tutorials deploying a rails
  • Active Directory - 检查密码是否永不过期?

    Visual Basic 中有没有办法检查 Active Directory 中的用户密码是否设置为永不过期 我找到了一种方法来查找最后更改的日期 但我找不到其他可用的选项 Dim de As DirectoryServices Direc
  • 使用散景:如何绘制可变大小的节点和节点颜色?

    我正在尝试使用 networkx 显示图表bokeh 12 7 that 节点大小基于节点度数 基于另一个节点属性的颜色 期望的输出 数据设置 import pandas as pd import numpy as np import ne
  • Firebase AngularFire 隐式同步和显式同步之间的区别

    我是 firebase 新手 我想用 AngularJS 构建它 我发现了 AngularFire 在列出的 angularFire 文档中 隐式和显式同步 我试图理解github中的文档 但我仍然不明白它们有什么区别以及如何使用它们 an
  • 在 WinForms 桌面应用程序中使用 jQuery?

    我们有一个 WinForms 桌面应用程序 它广泛使用 NET 2 0 框架 WebBrowser 控件来显示 HTML HTML 可能很简单 也可能非常复杂 它可以驻留在磁盘上 也可以在运行时直接写入文档属性 我想知道是否有人有使用 jQ
  • 在站点包中安装 Python 单元测试是否有意义?

    我正在开发我的第一个 Python 发行包 我的学习曲线 Python 打包似乎有点趋于平稳 但我仍在努力解决 一些悬而未决的问题 一是我是否应该让我的单元测试 与我的代码一起安装 我明白在源代码分发中包含测试很重要 https stack