从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容器这里使用的设计模式五.搞清楚不 ...
随机推荐
- Hugging Face x LangChain: 全新 LangChain 合作伙伴包
我们很高兴官宣发布 langchain_huggingface ,这是一个由 Hugging Face 和 LangChain 共同维护的 LangChain 合作伙伴包.这个新的 Python 包旨 ...
- c#笔记(3) 委托回调
委托回调是刚接触c#时最头疼的东西,老看老忘,遂整理一下现在对委托回调的理解.如有错误,请指出,感谢. 委托 C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方 ...
- dhcp报错
报错详情 查看dhcpd.service状态 使用命令检查配置文件报错 dhcpd -t -cf /etc/dhcp/dhcpd.conf 修改配置文件 重启dhcpd服务 [root@servera ...
- AT_agc044_c
problem & blog 由于看到和三进制有关的操作,可以想到建造每个结点都有三个儿子的 Trie.考虑维护两种操作. 1.Salasa 舞 对于这种操作,就是把每一个节点的第一个儿子和第 ...
- runliuv MSDN I TELL YOU
runliuv MSDN I TELL YOU 老站点:WIN SEVER ,VISUAL STUDIO 早期版本 老站点:https://msdn.itellyou.cn/ 新站点:最近的WIN10 ...
- fontawesome-webfont.woff:1 Failed to load resource: the server responded with a status of 404 ()
fontawesome-webfont.woff2:1 Failed to load resource: the server responded with a status of 404 ()fon ...
- C#.NET Rsa私钥加密公钥解密
在C#中,RSA私钥只能签名,不能加密,如果要加密,要借助BouncyCastle库. nuget 中引用 Portable.BouncyCastle. 工具类: RsaEncryptUtil usi ...
- core dump 路径定义以及监控
Core Dump 是什么? Core Dump 是指进程异常退出时,操作系统将进程的内存状态保存到文件中,这个文件就是 Core Dump 文件,中文一般翻译为"核心转储",哈, ...
- vite+vue3+ts+elementPlus前端框架搭建 [一]
记录下搭建vite + vue3 + ts + elementPlus项目的过程及遇到的问题. 建议使用pnpm安装依赖,npm切换到pnpm 链接地址:[https://www.pnpm.cn/in ...
- Filter过滤器进行统一参数处理demo
Filter过滤器进行统一参数处理demo import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet. ...