首页 > 编程语言 >从pytest源码的角度分析pytest工作原理

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

时间:2024-07-30 16:09:27浏览次数:16  
标签:实例 Session collect pytest 测试 原理 config 源码

从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)

 

标签:实例,Session,collect,pytest,测试,原理,config,源码
From: https://www.cnblogs.com/111testing/p/18332665

相关文章

  • springboot自学(4)自动配置原理
    自动配置原理1、收集spring开发者的编程习惯,整理开发过程使用的常用技术列表——》技术集A2、收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的常用设置列表——》设置集B3、初始化springboot基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境4、将技术集A......
  • Pycharm 设置 yaml 格式接口测试用例模板 (python+pytest+yaml)
    前言初次编写的伙伴们可能对yaml格式不太熟悉,自己写yaml用例的时候,总是格式对不齐啊记不住设定好的关键字啊等等等琐事是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm操作集:1、File-Settings(快捷键Ctrl+Alt+S) 2、Live......
  • 《Milvus Cloud向量数据库》——Spark Connector 工作原理及使用场景
    SparkConnector工作原理及使用场景深度解析在大数据处理与机器学习领域,ApacheSpark和Databricks已成为处理海量数据的首选工具。它们不仅能够高效地处理结构化数据,还擅长以批量的方式处理非结构化数据,进行数据清洗,并调用模型生成Embedding向量。然而,在处理完这些数据......
  • 连锁店收银系统源码
    千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银+线上商城+连锁店管理+ERP管理+商品管理+供应商管理+会员营销等功能为一体,线上线下数据全部打通。私有化独立部署/全开源源码,系统开发语言:核心开发语言:PHP、HTML5、Dart后台接口:PHP7.3后台管理网站:HTML5......
  • 跨链实现与原理
    跨链的实现和原理常见的有哪些跨链技术旨在解决不同区块链网络之间的互操作性问题,使得这些区块链可以相互通信、交换价值和数据。以下是几种常见的跨链实现和原理:1.中继(Relays)中继是一种跨链技术,通过一个中继合约来监听一个区块链上的事件,并将这些事件转发到另一个区块链上。......
  • ChatGPT:人工智能聊天机器人的工作原理详解
    ChatGPT:人工智能聊天机器人的工作原理详解在近年来的科技浪潮中,人工智能(AI)的飞速发展让我们见证了无数令人惊叹的成果。其中,ChatGPT作为一款先进的聊天机器人,凭借其出色的对话能力和广泛的应用场景,引起了广泛的关注。那么,ChatGPT是如何工作的呢?本文将为你揭开ChatGPT的神秘......
  • 协议-TLS协议-客户端TLS解密的实现原理
    参考来源:练习实践-TLS协议01-Wireshark对https数据的解密练习实践-TLS协议01-客户端curl配合sslkey文件实现解密极客时间:网络排查案例课-实战二:应用层真实案例揭秘篇-20丨TLS加解密:如何解密HTTPS流量?客户端如何做TLS解密?这里说的客户端,包括了Chrome、Firefox等浏览......
  • 雷达气象学(5)——多普勒天气雷达的原理
    目录5.1多普勒效应和多普勒频移5.2最大不模糊速度和速度模糊5.2.1脉冲对处理技术5.2.2最大不模糊速度5.2.3速度模糊5.2.4速度退模糊算法5.3最大不模糊距离和距离折叠5.3.1最大不模糊距离5.3.2距离折叠5.3.3距离去折叠的方法5.4多普勒两难5.5WSR-88D的取样技术5.1多......
  • ActiViz基础完整教程导航 (订阅免费赠送最新ActiViz 9.3源码)
    ActiViz基础完整教程导航(订阅免费赠送最新ActiViz9.3源码)1.ActiViz中的灯光2.ActiViz中的相机3.ActiViz中的角色4.ActiViz中的管线机制5.ActiViz中的颜色映射表vtkLookupTable6.ActiViz中的数据对象vtkDataObject7.ActiViz中的数据对象vtkDataSet8.ActiV......
  • 网站源码医疗器械pbootcms模板网页设计主题
    医疗器械的网站设计分享我很高兴向大家介绍我刚刚制作的医疗器械的网站设计。友好的站点界面,是打动访客的第一步。医疗器械网站主题网站设计应当紧密围绕医疗器械行业的特点和用户需求,提供直观、专业且易于使用的在线平台。以下是医疗器械网站主题网站设计的详细介绍:1.网站......