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

pytest 的启动过程
命令行解析:
pytest的入口点是conftest.py文件中的pytest.main()函数。- 在这个函数中,首先通过
pytest.config.get_config()获取配置。 - 接着使用
pytest.config.parse()来解析命令行参数。
配置加载:
pytest会在当前目录及其父目录递归地查找配置文件,比如pytest.ini或pyproject.toml。- 使用
pytest.config.Config类来存储配置信息。
插件管理:
- 通过
pytest.hookspec和pytest.pluginmanager来管理插件。 - 插件可以在各个阶段被注册并调用。
- 通过
测试收集过程
收集器初始化:
pytest使用pytest.collect模块来处理测试收集。Session.from_parent方法创建一个新的Session实例。Collector.from_parent方法用于构建收集器树。
测试文件发现:
pytest通过Session.perform_collect方法来遍历目录结构并发现测试模块。File.from_parent方法用于创建File实例来代表测试文件。Function.from_parent方法用于创建Function实例来代表测试函数。
测试项构建:
- 一旦发现了测试文件,就会通过
collect方法来收集文件中的测试函数。 - 测试函数会被转换成
Item实例。
- 一旦发现了测试文件,就会通过
测试执行过程
测试项准备:
- 在测试开始之前,会调用
Session.perform_setup方法来进行一些预处理。 - 这个阶段可能包括设置环境变量、初始化数据库连接等。
- 在测试开始之前,会调用
测试项执行:
Session.runtestloop方法控制测试项的实际执行。- 对于每一个
Item实例,都会调用Session.perform_test方法来执行测试。
测试结果收集:
- 测试执行的结果会被收集并存储在
Item实例中。 - 可能会触发
pytest_runtest_logreporthook,该 hook 被用来处理测试报告。
- 测试执行的结果会被收集并存储在
异常处理:
- 如果测试过程中发生异常,
pytest会捕获这些异常并记录下来。 - 异常可以通过
pytest_runtest_makereporthook 来处理。
- 如果测试过程中发生异常,
测试报告生成
Session实例负责收集所有的测试结果。Session.exitstatus属性会根据测试结果来确定程序的退出状态码。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工作原理的更多相关文章
- 从源码的角度分析ViewGruop的事件分发
从源码的角度分析ViewGruop的事件分发. 首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View ...
- 第九节:从源码的角度分析MVC中的一些特性及其用法
一. 前世今生 乍眼一看,该标题写的有点煽情,最近也是在不断反思,怎么能把博客写好,让人能读下去,通俗易懂,深入浅出. 接下来几个章节都是围绕框架本身提供特性展开,有MVC程序集提供的,也有其它程序集 ...
- 从Android源码的角度分析Binder机制
欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 前言 大家好,好久不见,距离上篇文章已经有35天之久了,因为身体不舒服 ...
- 从源码角度分析 MyBatis 工作原理
一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示例来进行讲解.完整示例源码地址 1.1. 数据库准备 ...
- 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表
1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...
- 从源码的角度分析List与Set的区别
很多时候我们在讨论List与Set的异同点时都在说: 1.List.Set都实现了Collection接口 2.List是有序的,可以存储重复的元素,允许存入null 3.Set是无序的,不允许存储重 ...
- CoreCLR源码探索(七) JIT的工作原理(入门篇)
很多C#的初学者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C#会通过编译器(CodeDom, Roslyn)编译成IL代码, 然后CLR(.Net Framew ...
- CoreCLR源码探索(八) JIT的工作原理(详解篇)
在上一篇我们对CoreCLR中的JIT有了一个基础的了解, 这一篇我们将更详细分析JIT的实现. JIT的实现代码主要在https://github.com/dotnet/coreclr/tree/m ...
- 转载 CoreCLR源码探索(七) JIT的工作原理(入门篇)
转载自:https://www.cnblogs.com/zkweb/p/7687737.html 很多C#的初学者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C# ...
- 框架源码系列八:Spring源码学习之Spring核心工作原理(很重要)
目录:一.搞清楚ApplicationContext实例化Bean的过程二.搞清楚这个过程中涉及的核心类三.搞清楚IOC容器提供的扩展点有哪些,学会扩展四.学会IOC容器这里使用的设计模式五.搞清楚不 ...
随机推荐
- TDSQL数据库考试实操题
第一题: 演练二 物理备份(5分) 答: 第二题:2. 演练一 请根据给定的演练方案,进行相关演练,并按如下要求提交截图 主备切换(5分) 答: 第三题:3. 演练一 请根据给定的演练方案,进行相关演 ...
- 瑞数456vmp逆向分析
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...
- ETL工具-nifi干货系列 第十四讲 nifi处理器QueryDatabaseTableRecord查询表数据实战教程
1.处理器QueryDatabaseTableRecord和处理器QueryDatabaseTable比较相似,该组件生成一个 SQL 查询,或者使用用户提供的语句,并执行它以获取所有在指定的最大值列 ...
- P7897
problem && blog 第一道正经的 Ynoi,特此写篇题解纪念一下. Algorithm 1 可以想到 \(O(nm)\) 的 DP. 我们定义 \(dp_u\) 为 \(u ...
- ABC321题解
E: problem LCA题. 我们枚举向上跳 \(t\) 步,跳到了 \(y\). 假如说 \(t = 0\) 那么我们计算 \(\text{clac}(x,k)\) 即可.(\(\text{cl ...
- rust程序设计(4)关于 trait | impl 相关的概念和疑问
trait是什么? Rust中的trait是一种定义可被多种类型实现的共享行为的方式.它类似于Java或C#中的接口.通过trait,你可以定义一组方法签名(有时包括默认实现),不同的类型可以实现这些 ...
- Javascript高级程序设计第五章 | ch5 | 阅读笔记
基本引用类型 Date 在不给定时间的情况下创建Date实例,创建的对象将保存当前的日期和时间. 要基于其他时间创建Date对象,必须传入其毫秒时表示 Date.parse() 月/日/年(5/21/ ...
- 燕千云ITAM:解锁数字化时代下企业竞争新优势
数字化时代下,企业的IT资产管理(ITAM)尤为关键.企业通过在成长的每个阶段实施有效的IT资产管理策略,以确保资源的最优化利用和风险的有效控制,并在竞争激烈的市场环境中保持优势.然而实际实践中,企业 ...
- 【前端求助帖】关于使用element-plus select 模板嵌套popover中使用select选择后,上一个select自动关闭的问题
主页代码如下 项目使用的是Vue3+vite, 下载后,直接pnpm i安装依赖, pnpm dev 就是可以跑起来 <el-button type="warning" ...
- 轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略
前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意.他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上. 本来是计划使用成熟的组件库来实现, ...