本文系《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
领取专属 10元无门槛券
私享最新 技术干货