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

从pytest源码的角度分析pytest工作原理的更多相关文章

  1. 从源码的角度分析ViewGruop的事件分发

    从源码的角度分析ViewGruop的事件分发. 首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View ...

  2. 第九节:从源码的角度分析MVC中的一些特性及其用法

    一. 前世今生 乍眼一看,该标题写的有点煽情,最近也是在不断反思,怎么能把博客写好,让人能读下去,通俗易懂,深入浅出. 接下来几个章节都是围绕框架本身提供特性展开,有MVC程序集提供的,也有其它程序集 ...

  3. 从Android源码的角度分析Binder机制

    欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 前言 大家好,好久不见,距离上篇文章已经有35天之久了,因为身体不舒服 ...

  4. 从源码角度分析 MyBatis 工作原理

    一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示例来进行讲解.完整示例源码地址 1.1. 数据库准备 ...

  5. 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表

    1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first  .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...

  6. 从源码的角度分析List与Set的区别

    很多时候我们在讨论List与Set的异同点时都在说: 1.List.Set都实现了Collection接口 2.List是有序的,可以存储重复的元素,允许存入null 3.Set是无序的,不允许存储重 ...

  7. CoreCLR源码探索(七) JIT的工作原理(入门篇)

    很多C#的初学者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C#会通过编译器(CodeDom, Roslyn)编译成IL代码, 然后CLR(.Net Framew ...

  8. CoreCLR源码探索(八) JIT的工作原理(详解篇)

    在上一篇我们对CoreCLR中的JIT有了一个基础的了解, 这一篇我们将更详细分析JIT的实现. JIT的实现代码主要在https://github.com/dotnet/coreclr/tree/m ...

  9. 转载 CoreCLR源码探索(七) JIT的工作原理(入门篇)

    转载自:https://www.cnblogs.com/zkweb/p/7687737.html 很多C#的初学者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C# ...

  10. 框架源码系列八:Spring源码学习之Spring核心工作原理(很重要)

    目录:一.搞清楚ApplicationContext实例化Bean的过程二.搞清楚这个过程中涉及的核心类三.搞清楚IOC容器提供的扩展点有哪些,学会扩展四.学会IOC容器这里使用的设计模式五.搞清楚不 ...

随机推荐

  1. 记一次 .NET某工业设计软件 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他的软件在客户那边不知道什么原因崩掉了,从windows事件日志看崩溃在 clr 里,让我能否帮忙定位下,dump 也抓到了,既然dump有了,接下来就 ...

  2. nfs 加 auto 自动挂载/etc/fstab;autofs

    一,用/etc/fstab 1.在/etc/fstab里面添加一条配置文件 vim /etc/fstab #在里面添加一条配置信息 192.168.200.10:/opt/share2 /mnt/sh ...

  3. Java实现延迟执行代码

    Java实现延迟执行代码对于Java程序在它们的操作中添加延迟或暂停是比较常见的.这对于任务暂停直到另外任务完成执行场景比较有用.本文我们提供两类方法实现延迟执行. 1. 基于线程(Thread)方法 ...

  4. GIT 生成变更历史文件清单

    脚本搞定git文件版本变化信息,解决部署种变更的审核和统计信息工作复杂问题 git diff --name-status --ignore-cr-at-eol --ignore-space-at-eo ...

  5. 用 Python 绘制现金流量图

    目录 用 Python 绘制现金流量图 Python 实现 实现原理 具体代码 使用示例 1:根据现金流量表绘制现金流量图 使用示例 2:绘制等额.等差.等比序列现金流量图 等额序列现金流量图 等差序 ...

  6. Kubernetes容器生命周期 —— 钩子函数详解(postStart、preStop)

    1.概述 容器生命周期钩子(Container Lifecycle Hooks)监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数. 钩子函数能够感知自身生命周期中的事件,并在相应的时刻到 ...

  7. WPS中导入endnote插件

    WPS中导入endnote插件 1. 找到 Endnote 插件的目录: D:\Program Files (x86)\EndNote 20\Product-Support\CWYW   2. 把Cw ...

  8. Apache Kylin(三)Kylin上手

    Kylin 上手 根据Kylin 官方给出的测试数据,我们实际操作一下 Kylin. 1. 导入 Hive 数据 首先创建一个project,在界面左上角有个"Add Project&quo ...

  9. arm linux 移植 SQLite 3

    背景 SQLite 是 一个 常用于 嵌入式平台的 轻量级数据库. host平台 :Ubuntu 16.04 arm平台 : S5P6818 SQLite :3.31.1 arm-gcc :4.8.1 ...

  10. Linux系统获取开发板的文件系统并打包成img文件

    应用情形: 在实际的开发中,由于原系统包含的功能有限,而根据项目的需要,安装了相应的库及运行项目程序所创建的各种文件,和所做 的各种配置,想将调试好的系统打包发布,进行批量生产,就可参考本文提供的方法 ...