从pytest源码的角度分析pytest工作原理

从pytest源码的角度分析pytest工作原理

从 pytest 源代码的角度来分析其工作原理,我们需要关注几个关键的部分,特别是 pytest 的启动过程以及测试的收集与执行。下面是基于 pytest 源代码的一个高层次的概述。

pytest 的启动过程

  1. 命令行解析:

    • pytest 的入口点是 conftest.py 文件中的 pytest.main() 函数。
    • 在这个函数中,首先通过 pytest.config.get_config() 获取配置。
    • 接着使用 pytest.config.parse() 来解析命令行参数。
  2. 配置加载:

    • pytest 会在当前目录及其父目录递归地查找配置文件,比如 pytest.ini 或 pyproject.toml。
    • 使用 pytest.config.Config 类来存储配置信息。
  3. 插件管理:

    • 通过 pytest.hookspec 和 pytest.pluginmanager 来管理插件。
    • 插件可以在各个阶段被注册并调用。

测试收集过程

  1. 收集器初始化:

    • pytest 使用 pytest.collect 模块来处理测试收集。
    • Session.from_parent 方法创建一个新的 Session 实例。
    • Collector.from_parent 方法用于构建收集器树。
  2. 测试文件发现:

    • pytest 通过 Session.perform_collect 方法来遍历目录结构并发现测试模块。
    • File.from_parent 方法用于创建 File 实例来代表测试文件。
    • Function.from_parent 方法用于创建 Function 实例来代表测试函数。
  3. 测试项构建:

    • 一旦发现了测试文件,就会通过 collect 方法来收集文件中的测试函数。
    • 测试函数会被转换成 Item 实例。

测试执行过程

  1. 测试项准备:

    • 在测试开始之前,会调用 Session.perform_setup 方法来进行一些预处理。
    • 这个阶段可能包括设置环境变量、初始化数据库连接等。
  2. 测试项执行:

    • Session.runtestloop 方法控制测试项的实际执行。
    • 对于每一个 Item 实例,都会调用 Session.perform_test 方法来执行测试。
  3. 测试结果收集:

    • 测试执行的结果会被收集并存储在 Item 实例中。
    • 可能会触发 pytest_runtest_logreport hook,该 hook 被用来处理测试报告。
  4. 异常处理:

    • 如果测试过程中发生异常,pytest 会捕获这些异常并记录下来。
    • 异常可以通过 pytest_runtest_makereport hook 来处理。

测试报告生成

  1. Session 实例负责收集所有的测试结果。
  2. Session.exitstatus 属性会根据测试结果来确定程序的退出状态码。
  3. pytest 可以生成多种格式的报告,这取决于安装的插件。

示例代码片段

下面是一些示例代码片段,展示了 pytest 源代码中的关键部分:

复制代码
# pytest/conftest.py
def main(args=None):
    # 解析命令行参数
    config = get_config(args)
    # 加载插件
    pm = PluginManager()
    pm.load_setuptools_entrypoints('pytest11')
    # 创建 Session 实例
    session = Session.from_parent(config, plugins=pm)
    # 执行测试
    session.runtestloop()
    # 返回退出状态
    return session.exitstatus

# pytest/collect.py
def perform_collect(session, collector):
    # 收集测试文件和测试函数
    items = []
    for item in collector.collect():
        items.append(item)
    return items

# pytest/runner.py
def runtest_protocol(item, nextitem):
    # 执行测试项
    report = item.runtest()
    if report is None:
        # 处理异常情况
        report = item.makereport()
    # 处理测试报告
    item.session._hookmanager.hook.pytest_runtest_logreport(report=report)
相关推荐
落魄大学生之流水线上谋生计2 天前
pytest 入门与实践:从第一个测试到可维护的测试体系
pytest
念越3 天前
Allure 测试报告保姆级教程:从安装到 pytest 集成与报告生成
pytest·allure
念越4 天前
接口自动化测试从入门到实战:接口用例设计、Requests、Pytest、YAML、JSON Schema 与 Allure 报告
python·测试工具·自动化·json·pytest
蒸鱼Yuzheng8 天前
自动化 Socket 协议设计:消息序列、心跳、幂等重试与背压
自动化测试·python·websocket·socket·分布式系统
测试者家园8 天前
不写测试用例也能做自动化测试?
自动化测试·软件测试·人工智能·测试用例·智能化测试
霍格沃兹测试学院-小舟畅学8 天前
AI+Swagger:一键生成500条pytest接口用例
人工智能·pytest
矩子01X9 天前
车载总线日志解码工具实测:4 款方案从免费开源到企业级
自动化测试·汽车测试·can日志解析
艺杯羹10 天前
当网页塞进桌面端:基于Playwright的客户端模式无头自动化回归与视觉断言
自动化测试·ui自动化·playwright·e2e测试·软件质量工程
蒸鱼Yuzheng10 天前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
把头塞进显示器17 天前
电商平台-测试报告
python·selenium·pytest