首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pytest的内置插件盘点23. freeze_support | 为PyInstalle打包pytest测试框架提供支持

本文系《pytest源码剖析》系列内容

23. freeze_support

插件路径:_pytest.freeze_support

实现的 hook

调用的 hook

定义的 fixture

插件功能

1. 收集内部模块,供其它工具使用

代码片段

def freeze_includes() -> List[str]: import _pytest

result = list(_iter_all_modules(_pytest)) return result

def _iter_all_modules( package: Union[str, types.ModuleType], prefix: str = "",) -> Iterator[str]:

import os import pkgutil

if isinstance(package, str): path = package else: package_path = package.__path__ # type: ignore[attr-defined] path, prefix = package_path[0], package.__name__ + "." for _, name, is_package in pkgutil.iter_modules([path]): if is_package: for m in _iter_all_modules(os.path.join(path, name), prefix=name + "."): yield prefix + m else: yield prefix + name

提供一个外部函数,调用内部函数

内部函数使用迭代的方式,不断遍历_pytest内部模块

简评

插件内没有使用任何 hook 和 fixture,完全不像一个 pytest 插件

甚至一度怀疑我的脚本有 bug,把普通模块识别成了插件。。

可是在 pytest 的config插件源码中,又确确实实把freeze_support为默认插件之一

有点怪。。。

...

通过在社区交流了解到:

此插件迭代 pytest 的所有模块,供PyInstaller、cx_freeze、py2exe等冻结打包程序,在处理包含 pytest 的项目时自动收集模块

所以它不是一个内部使用的插件,是为外部工具服务的插件

...

比如PyInstaller在打包pytest时会自动调用该插件,代码如下

import pytest

hiddenimports = pytest.freeze_includes()

所以把测试框架打包成 exe 时,可以优先考虑PyInstaller,

事实上,我只用PyInstaller打包过测试框架,可以说非常顺利(当然 PyInstaller 本身还是需要配置一番的)

...

如果是freeze_support 是一个完全对外的插件,那么pytest还有一个完全对内的插件:pytester

pytester是一个测试pytest内部功能的插件,在进行pytest内部迭代、或者开发第三方插件时,会使用它来验证是否正常工作

因为它是一个开发辅助插件,所以普通用户在使用pytest时,不会感受到它的存在

...

想起一个老梗:

Linux是用Linux进行编译的

git是用git进行版本控制的

pytest是用pytest进行测试的

To win a smile from you

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OfDF81cOhv5Af0TIoMUdI7gg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券