pytest的内置插件盘点7:python

本文系《pytest源码剖析》系列内容

正在连载,欢迎关注

图片

7. 内置插件 python

插件路径:_pytest.python

实现的 hook

hooktryfirsttrylastoptionalhookhookwrapperwrapper
pytest_addoptionFalseFalseFalseFalseFalse
pytest_cmdline_mainFalseFalseFalseFalseFalse
pytest_collect_fileFalseFalseFalseFalseFalse
pytest_configureFalseFalseFalseFalseFalse
pytest_generate_testsFalseFalseFalseFalseFalse
pytest_pycollect_makeitemFalseFalseFalseFalseTrue
pytest_pycollect_makemoduleFalseFalseFalseFalseFalse
pytest_pyfunc_callFalseFalseFalseFalseTrue

调用的 hook

  • pytest_pycollect_makeitem

  • pytest_collect_file

  • pytest_pyfunc_call

  • pytest_make_parametrize_id

  • pytest_pycollect_makemodule

  • pytest_ignore_collect

插件功能

  1. 创建一系列 ini 配置,指定 python 用例的发现规则:

    • python_files: 文件名,默认值 test_*.py, *_test.py

    • python_classes:类名前缀,默认值 Test

    • python_functions,函数名前缀,默认值 test

  2. 创建 Item 子类,作为测试用例对象,_pytest.python.Function

  3. 根据规则,从各目录、文件、类中,收集测试用例,实例化 Item

  4. 实现 hookpytest_pyfunc_call,执行用例中的代码

代码片段

def pytest_pycollect_makemodule(module_path: Path, parent) -> "Module":if module_path.name == "__init__.py":pkg: Package = Package.from_parent(parent, path=module_path)return pkgmod: Module = Module.from_parent(parent, path=module_path)return modclass Module(nodes.File, PyCollector):def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]:self._inject_setup_module_fixture()self._inject_setup_function_fixture()self.session._fixturemanager.parsefactories(self)return super().collect@hookimpl(trylast=True)
def pytest_pyfunc_call(pyfuncitem: "Function") -> Optional[object]:testfunction = pyfuncitem.objif is_async_function(testfunction):async_warn_and_skip(pyfuncitem.nodeid)funcargs = pyfuncitem.funcargstestargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}result = testfunction(**testargs)if hasattr(result, "__await__") or hasattr(result, "__aiter__"):async_warn_and_skip(pyfuncitem.nodeid)elif result is not None:warnings.warn(PytestReturnNotNoneWarning(f"Expected None, but {pyfuncitem.nodeid} returned {result!r}, which will be an error in a ""future version of pytest.  Did you mean to use `assert` instead of `return`?"))return True
  1. 收集用例时判断文件名,将__init__视为包,否则视为模块

  2. 将文件中 setUpModule 和 setup_module 风格的夹具,转为标准 fixture

  3. 将类、函数、参数化等所有类型的用例,转为 item 对象

  4. 生成器和协程,不被视为用例,也不执行

  5. 用例执行结果必须是 None,也就是不应该有返回值

简评

从实现和调用hook的数量可以看出,本插件在pytest中的重要性较大

...

该插件长度 1800 + 行,详细定义了在收集用例和执行用例时,遇到 Python 文件、包、模块、类、函数会如何进行处理

...

对于模块级夹具有 3 几种写法:

  1. setup / teardown

  2. setUpModule / tearDownModule

  3. setup_module / teardown_module

第一种是测试框架 nose 的写法,pytest 从 7.2.0 开始不再兼容 nose 框架,这种写法无了

第二种是测试框架 unittest 的写法,这是 python 的标准库,应该会一直兼容下去

第三种是测试框架 pytest 的写法,是仿 xunit 风格,使用非面向对象的方式来创建夹具

在实际的运行过程中中,所有的写法都会统一处理成 fixture,建议一步到位直接写 fixture

...

pytest 只会将函数(function)、方法(method),会被视为测试用例,

除了名字前缀的要求之外,还要求用例没有参数、没有返回值。

...

方法所在的类,也不能有__init__方法,

一方面,__ini__方法往往需要传递参数,这违背了上面说的要求

另一方面,实例化之后,实例对象会让方法与方法之间建立了关联

可是,测试用例之间不应该有关联

所以也就根本不需要__init__

...

该插件充斥大量的实现细节,篇幅原因就不展开了,

有兴趣的话你也可以亲自看看源码,会收益颇丰的

首发于公众号:测试开发研习社

原创不易,喜欢请星标+点赞+在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437817.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入:二次注入

SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 SQL注入:盲注-CSDN博客 目录 什么是二次注入? 二次注入演示 1、可以注册新用户 2、可以登录->…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题可以看做一个动态规划问题。其中,字符串s是背包,而字典中的单词就是物品。…

【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 交换排序 快速排序 hoare版代…

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作:并发修改异常增强循环遍历数组:遍历集合:遍历字符串:限制 list接口ListIteratorArrayList创建 ArrayList:添加元素:获取元素:修…

如何在Microsoft Teams会议中开启元宇宙教学模式

在之前的文章中我们分享了如何在Microsoft Teams中搭建元宇宙的教学场景,通过在Teams中的某个组里添加“选项卡”的形式进行元宇宙的场景搭建和使用。 今天我们来继续介绍如何通过Teams的会议模式来使用元宇宙。首先,进入Teams后点击右上角的“会议”。 …

HarmonyOS --@state状态装饰器

在声明式UI中,是以状态驱动视图更新。 状态(state):指驱动视图更新的数据(被装饰器标记的变量)。 试图(view):基于UI描述渲染得到用户界面 State装饰器标记的变量必须初…

promethues基础概念

promethues是一个开源的系统监控以及报警系统,整个zabbix的功能,系统,网络,设备 promethues可以兼容网络和设置被,容器监控,告警系统,因为他和k8s是一个项目基金开发的产品,天生匹配…

烟台莱州市事业单位报名流程及照片审核处理方法图文详解

烟台莱州市的事业单位招聘考试一直是众多求职者关注的焦点,今年也不例外。随着招聘季的到来,烟台莱州市的事业单位报名工作已经正式启动。对于有意向加入莱州市事业单位的朋友们来说,这是一个不容错过的机会。小编已经为大家精心准备了详细的…

Flink Checkpoint 超时问题详解

第一种、计算量大,CPU密集性,导致TM内线程一直在processElement,而没有时间做CP【过滤掉部分数据;增大并行度】 代表性作业为算法指标-用户偏好的计算,需要对用户在商城的曝光、点击、订单、出价、上下滑等所有事件进…

Java8-Stream 流基本应用-groupBy进行分组

groupBy进行分组 Testpublic void testStreamGroupBy(){List<UserInfoModel> resultnew ArrayList<>();for (int i 0; i < 10; i) {UserInfoModel usernew UserInfoModel();user.setUserId(i"");user.setUserName("kangshihang");result.a…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

5、主成分分析(Principal Component Analysis)

通过分析变异发现新特征。 文章目录 1、简介2、主成分分析3、PCA用于特征工程4、示例 - 1985年的汽车1、简介 在上一课中,我们研究了我们的第一个基于模型的特征工程方法:聚类。在这一课中,我们将研究我们的下一个方法:主成分分析(PCA)。就像聚类是基于接近度对数据集进…