从源码的角度重新认识pytest(中)

3. pytest 目录结构

从 github 上 pytest 代码仓库中得到的文件非常多,其中大部分是工程文件,存放 python代码的是下面两个目录

  • testing 目录存放 pytest 的测试用例
  • src 目录存放 pytest 的源代码

对测试用例简单地浏览之后便可发现: pytest 是使用 pytest 进行测试的

这让我忍不住想到:linux 是通过 linux 编译内核的、git 是通过 git 管理源码的。。。

言归正传,今天的重点是 src 目录

从源码的角度重新认识pytest(中)

这里有 2 个目录和一个文件:

文件:py.py,移除依赖库 py 后的补丁

pytest 原名 py.test,是 py 工具库的一部分,也依赖了 py 库的其他工具,这里保存了一个 py.py,便可以 从依赖中将py移除了

目录:pytest,提供 pytest 的入口,支持代码调用、命令执行、模块执行

目录下有两个文件:

  • __init__.py : 提供 import 统一入口,方便其他 python 代码使用 pytest
  • __main__.py:提供模块命令的执行入口,方便命令行的方式使用pytest

目录:_pytest, 这里才是真正存放源码的地方,

下划线开头的包名是在 python 中有特殊含义:” 这是内部空间,不建议直接使用和操作

_pytest 目录下有 53 个包和模块,其中:

6 个下划线开头的分别是:

|-- __init__.py      # 导入版本号
|-- _argcomplete.py  # 为bash 提供pytest 命令的自动补全
|-- _code            # 对python代码进行面向对象式的包装
|-- _io              # 对控制台输出进行包装
|-- _py              # 对os.path 进行包装,推测这个可能会移除
|-- _version.py      # pytest版本号,动态生成而来

47 个非下划线开头的包 / 模块,这部分内容比较多,通过脚本分析内容,初步可以分为 2 大类:

  • pluggy 插件
======name, package or module, pluggy plugin  ======
('assertion', 'package', True)
('cacheprovider.py', 'module', True)
('capture.py', 'module', True)
('config', 'package', True)
('debugging.py', 'module', True)
('doctest.py', 'module', True)
('faulthandler.py', 'module', True)
('fixtures.py', 'module', True)
('helpconfig.py', 'module', True)
('hookspec.py', 'module', True)
('junitxml.py', 'module', True)
('legacypath.py', 'module', True)
('logging.py', 'module', True)
('main.py', 'module', True)
('mark', 'package', True)
('nose.py', 'module', True)
('pastebin.py', 'module', True)
('pytester.py', 'module', True)
('python.py', 'module', True)
('python_path.py', 'module', True)
('reports.py', 'module', True)
('runner.py', 'module', True)
('setuponly.py', 'module', True)
('setupplan.py', 'module', True)
('skipping.py', 'module', True)
('stepwise.py', 'module', True)
('terminal.py', 'module', True)
('threadexception.py', 'module', True)
('tmpdir.py', 'module', True)
('unittest.py', 'module', True)
('unraisableexception.py', 'module', True)
('warnings.py', 'module', True)
  • 非 pluggy 插件
======name, package or module, pluggy plugin  ======
('compat.py', 'module', False)
('deprecated.py', 'module', False)
('freeze_support.py', 'module', False)
('monkeypatch.py', 'module', False)
('nodes.py', 'module', False)
('outcomes.py', 'module', False)
('pathlib.py', 'module', False)
('py.typed', 'module', False)
('pytester_assertions.py', 'module', False)
('python_api.py', 'module', False)
('recwarn.py', 'module', False)
('scope.py', 'module', False)
('stash.py', 'module', False)
('timing.py', 'module', False)
('warning_types.py', 'module', False)

在 47 个包 / 模块中,有 32 个是 pluggy 类型的插件,

也从侧面体现出 pluggy 在 pytest 中的核心地位

本文系《pytest源码剖析》系列内容,首发于公众号

正在连载,欢迎关注

Original: https://blog.csdn.net/python_sanmu/article/details/128407612
Author: 测试开发三木
Title: 从源码的角度重新认识pytest(中)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/776890/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球