从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容器这里使用的设计模式五.搞清楚不 ...
随机推荐
- MQ的相关概念
MQ的相关概念 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下 ...
- java中判断String类型为空和null的方法
1.判断一个String类型的变量是否为空(即长度为0)或者为null 在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查.这是因为n ...
- 算法金 | 再见,PCA 主成分分析!
大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 1. 概念:数据降维的数学方法 定义 主成分分析(PCA)是一种统计方法,通过正交变 ...
- 鼠标悬浮显示鼠标停留数据的内容 elementui + vue
先看效果图 直接上代码 <el-tabs v-model="activeName" @tab-click="handleClick"> <el ...
- NumPy 舍入小数、对数、求和和乘积运算详解
舍入小数 在 NumPy 中,主要有五种方法来舍入小数: 截断 去除小数部分,并返回最接近零的浮点数.使用 trunc() 和 fix() 函数. 示例: import numpy as np arr ...
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not
java.sql.SQLException: Connection is read-only. Queries leading to data modification are not 产生的原因:事 ...
- python 文件查找及截取字符串 (替换,分割) demo
#"F:\\test.txt" ''' # 例1:字符串截取 str = '12345678' print str[0:1] # 例2:字符串替换 str = 'akakak' s ...
- 面试官:Java中缓冲流真的性能很好吗?我看未必
一.写在开头 上一篇文章中,我们介绍了Java IO流中的4个基类:InputStream.OutputStream.Reader.Writer,那么这一篇中,我们将以四个基类所衍生出来,应对不同场景 ...
- python 发起PUT请求,报"Method not Allowed" 和 取返回的报文的内容
发起请求的时候,默认使用的POST请求方式,导致发起请求,返回[405 Method not Allowed ],检查此更新接口的请求方式为PUT,更改请求方式为PUT PUT接口返回的内容,不能通过 ...
- iOS开发流程总结(新坑持续更新)
[上线前流程] 将测试环境修改成正式环境 修改版本号,而且build version比version多一位,如version设置为1.0.1,那么build就设置成1.0.1.x:这么做的理由是,当你 ...