测试框架pytest教程(6)钩子函数hook开发pytest插件

news2024/12/24 2:06:39

pytest hook 函数也叫钩子函数,pytest 提供了大量的钩子函数,可以在用例的不同生命周期自动调用。 比如,在测试用例收集阶段,可利用 hook 函数修改测试用例名称的编码。

pytest的hook是基于Python的插件系统实现的,使用特定的命名规范和装饰器来定义钩子函数。你可以在pytest插件或conftest文件中定义这些钩子函数。

pytest 可以识别到三种插件

内置插件:从 pytest 内部 _pytest 目录加载的插件

外部插件:通过 pip 安装的插件(比如: pip install pytest-ordering )。

conftest.py 插件:测试目录中的 conftest.py 加载

常用的pytest钩子函数

1. `pytest_configure(config)`: 在pytest启动时调用,可用于注册自定义标记、插件等。

2. `pytest_collection_modifyitems(config, items)`: 测试收集阶段调用,可以修改、筛选或排序收集到的测试项。

3. `pytest_runtest_protocol(item, nextitem)`: 在运行每个测试用例之前和之后调用,可以执行初始化、清理或自定义测试流程等操作。

4. `pytest_report_teststatus(report)`: 在测试用例执行后调用,可用于自定义测试结果报告。

5. `pytest_terminal_summary(terminalreporter)`: 在测试会话结束时调用,可用于生成自定义的测试总结报告。

通过使用这些钩子函数,你可以在pytest的不同阶段添加自己的逻辑和行为。这使得您可以自定义测试收集、执行、报告等方面,以满足特定的需求。

有许多其他的pytest钩子函数可以用于不同的目的和扩展。你可以在pytest的官方文档中查找完整的钩子函数列表以及每个钩子的详细说明和示例。

开发插件

pytest 提供了大量的 hook 函数,执行过程中几乎所有的行为都是可以定制的。那么,pytest 可以改写哪 些行为呢? 文字版 pytest hook 执行顺序:

root
└── pytest_cmdline_main
├── pytest_plugin_registered
├── pytest_configure
│ └── pytest_plugin_registered
├── pytest_sessionstart
│ ├── pytest_plugin_registered
│ └── pytest_report_header
├── pytest_collection
│ ├── pytest_collectstart
│ ├── pytest_make_collect_report
│ │ ├── pytest_collect_file
│ │ │ └── pytest_pycollect_makemodule
│ │ └── pytest_pycollect_makeitem
│ │ └── pytest_generate_tests
│ │ └── pytest_make_parametrize_id
│ ├── pytest_collectreport
│ ├── pytest_itemcollected
│ ├── pytest_collection_modifyitems
│ └── pytest_collection_finish
│ └── pytest_report_collectionfinish
├── pytest_runtestloop
│ └── pytest_runtest_protocol
│ ├── pytest_runtest_logstart
│ ├── pytest_runtest_setup
│ │ └── pytest_fixture_setup
│ ├── pytest_runtest_makereport
│ ├── pytest_runtest_logreport
│ │ └── pytest_report_teststatus
│ ├── pytest_runtest_call
│ │ └── pytest_pyfunc_call
│ ├── pytest_runtest_teardown
│ │ └── pytest_fixture_post_finalizer
│ └── pytest_runtest_logfinish
├── pytest_sessionfinish
│ └── pytest_terminal_summary
└── pytest_unconfigure

可以利用 pytest hook 强大的功能开发出自己的插件。

hook和fixture的区别

在pytest中,Hooks(钩子)和Fixtures(装置)是两个不同的概念。

Hooks(钩子)是pytest提供的一组钩子函数,用于自定义和扩展测试流程。钩子函数在特定的时间点被调用,并允许你插入自定义的代码来修改、补充或拦截测试操作,比如定制报告、自定义收集规则、执行前/后的初始化和清理等。Hooks通常由插件或conftest文件定义,并使用特定的命名规范和装饰器进行标记。使用hooks可以灵活地定制和扩展pytest的行为。

Fixtures(装置)是pytest的一项功能,用于管理测试用例的前置和后置操作。Fixture可以被看作为测试用例的准备和清理工作,并且可以在多个测试用例之间共享数据和资源。Fixture函数使用`@pytest.fixture`装饰器进行标记,并在测试函数的参数中使用。当测试函数需要使用该装置时,fixture函数将被自动执行并提供必要的数据和资源。Fixture可以执行一些初始化操作,为测试用例提供必要的数据,以及在测试结束后进行清理工作。使用fixture可以提高代码的复用性和可维护性,并减少测试用例之间的重复工作。

总结起来,Hooks允许你定制和扩展测试流程,而Fixtures则用于管理测试用例的前置和后置操作,并提供必要的数据和资源。Hooks是用于自定义pytest的整体行为,而Fixtures是用于测试用例级别的准备和清理工作。两者可以一起使用,以实现更高级别的自定义和测试管理。

pytest_collection_modifyitems

def pytest_collection_modifyitems(
    session: "Session", config: "Config", items: List["Item"]
) -> None:
    """Called after collection has been performed. May filter or re-order
    the items in-place.

    :param pytest.Session session: The pytest session object.
    :param pytest.Config config: The pytest config object.
    :param List[pytest.Item] items: List of item objects.
    """

可以看到该方法在用例收集后执行,可以筛选或者对用例执行顺序进行修改。 

插件开发-筛选收集到的用例

当你想要自定义收集阶段中的测试项时,可以使用`pytest_collection_modifyitems`钩子函数。这个钩子函数在pytest的测试收集过程中被调用,允许你对收集到的测试项进行修改、筛选或排序。

下面是一个使用`pytest_collection_modifyitems`的例子,假设你希望在测试收集阶段中只运行有特定标记的测试用例(比如`smoke`标记),在根目录的conftest.py中添加如下方法:

def pytest_collection_modifyitems(config, items):
    marked_items = []
    unmarked_items = []

    # 将有"smoke"标记的测试项放入marked_items列表,其他放入unmarked_items列表
    for item in items:
        if 'smoke' in item.keywords:
            marked_items.append(item)
        else:
            unmarked_items.append(item)

    # 只保留有"smoke"标记的测试项
    items[:] = marked_items

    # 打印被移除的未标记项的名称
    for item in unmarked_items:
        print(f"Skipping unmarked test: {item.nodeid}")

在上述代码中,`pytest_collection_modifyitems`钩子函数接收两个参数:`config`表示pytest的配置对象,`items`是测试收集阶段收集到的所有测试项(测试用例)的列表。我们首先遍历每个测试项,将有"smoke"标记的项放入`marked_items`列表,其他项放入`unmarked_items`列表。然后,我们通过将`items`列表替换为`marked_items`列表,实现只保留有"smoke"标记的测试项。最后,我们遍历`unmarked_items`列表,打印被移除的未标记项的名称作为提示信息。

可以看到test_b被跳过 

插件开发-改写用例名称编码

测试用例如下


@pytest.mark.parametrize("name",["哈利","赫敏"])
def test_encode(name):
    print(name)

运行时会出现乱码

在conftest.py中添加如下方法

def pytest_collection_modifyitems(config, items):
    for item in items:
        item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

再次运行可以看到节点id显示为中文了。

 插件打包

软件测试 | Pytest测试框架之插件开发_pytest_hook_函数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s挂载映射操作详解

k8s投射数据卷 Projected Volume 在 k8s 中,有几种特殊的 Volume,它们的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。" 从容器的角度来看,这些 Volume…

xlsx工作表隐藏了?不用担心,这些方法帮你恢复

在进行数据整理或保护时,很多用户可能会选择隐藏XLSX工作表。然而,当需要重新显示之前隐藏的工作表时,可能会感到困惑。不过,不用担心,下面将向您介绍xlsx工作表隐藏怎么恢复。 ▌第一部分:XLSX工作表隐藏…

结构型(三) - 享元模式

一、概念 享元模式(Flyweight Pattern):所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 优点:可以极大地减少内存中对象的数量&am…

鉴源实验室丨软件代码结构化覆盖测试-语句覆盖

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 引言: 之前我们一直在讲功能、性能、以及专项等相关的测试,这些测试主要集中在集成测试,系统验证等阶段&#x…

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

颜值爆表!这款开源的API工具用起来更优雅!

作为一名后端开发者,我们经常会使用API工具来调试接口,之前一直使用的Postman,用多了感觉它有点不够轻量级,有时候打开也比较慢。最近发现了一款轻量级的开源API工具Insomnia,界面挺炫酷,功能也很实用&…

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测 在煤矿生产中,空气质量是关系到矿工生命安全的重要因素。煤矿内部存在着各种有害气体,如甲烷、一氧化碳等,高浓度的有害气体会导致矿工中毒、窒息等危险情况,因此煤矿…

Linux journalctl命令详解(journalctl指令)(systemd服务默认日志管理工具)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示,日志会被压缩得满满当当。journal日志不会自动持久化…

HTML5+CSS3+JS小实例:环形文字动画特效

实例:环形文字动画特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

排序算法之详解冒泡排序

引入 冒泡排序顾名思义&#xff0c;就是像冒泡一样&#xff0c;泡泡在水里慢慢升上来&#xff0c;由小变大。虽然冒泡排序和冒泡并不完全一样&#xff0c;但却可以帮助我们理解冒泡排序。 思路 一组无序的数组&#xff0c;要求我们从小到大排列 我们可以先将最大的元素放在数组…

关于图像分类、图像识别和目标检测异同

计算机视觉是人工智能领域的一个重要分支&#xff0c;它旨在构建能够理解和处理图像、视频等视觉信息的计算机系统。在计算机视觉领域中&#xff0c;图像分类、图像识别和目标检测是三个重要的任务&#xff0c;当然目标跟踪、图像生成也是新的方向和延伸。 其实下面这幅图已经非…

A. Two Semiknights Meet

题目描述 可知走法为中国象棋中的象的走法 解题思路 利用结构体来存储两个 K K K的位置 x , y x,y x,y&#xff0c;因为两个 K K K同时走&#xff0c;所以会出现两种情况 相向而行&#xff0c;两者距离减少 相反而行&#xff0c;两者距离不变 我们完全可以不考虑格子是好…

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器&#xff0c;逐个尝试了下未授权&#xff0c;然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后&#xff0c;连接上去&#xff0c;这里用的是Another Redis Desktop M…

polar si9000使用---1

1、软件界面 2、表面单端信号 表层单端走线&#xff1a;1、走线表面未覆盖绿油&#xff1b;2、参考表面为完整的地平面&#xff1b;3、走线同层不进行铺铜操作&#xff0c;或者同层铺铜的距离大于参考地到走线距离H1&#xff1b; 表层单端走线&#xff1a;1、走线表面覆盖绿油…

【自适应稀疏度量方法和RQAM】疏度测量、RQAM特征、AWSPT和基于AWSPT的稀疏度测量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

wps 画项目进度甘特图

效果如上 步骤一&#xff1a; 创建excel 表格 步骤二&#xff1a; 选中开始时间和结束时间两列数据&#xff0c;右键设置单元格格式 步骤三&#xff1a; 选择数值&#xff0c;点击确定&#xff0c;将日期转成数值。 步骤四&#xff1a;插入图表 选中任务&#xff0c;开始时间…

什么是程序化交易接口?执行三步曲是什么?

在股市中的发展过程中&#xff0c;通过不断的更新迭代&#xff0c;从手动交易到自动交易的过程就有了历史的蜕变&#xff0c;那么对于程序化交易接口&#xff08;Application Programming Interface, API&#xff09;其实就是指为程序化交易提供的一组定义和规范&#xff0c;允…

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…

概率和统计,最大似然估计(MLE),大后验概率估计(MAP)

目录 1、概率和统计是一个东西吗&#xff1f; 2、贝叶斯公式到底在说什么&#xff1f; 3、似然函数 4、最大似然估计&#xff08;MLE&#xff09; 5、最大后验概率估计&#xff08;MAP&#xff09; MLE VS MAP 总结 贝叶斯公式分成两派&#xff1a;唯物主义的频率学派&a…

变频器和plc之间无线MODBUS通讯

在工业现场由PLC远程控制变频器的应用非常常见&#xff0c;如果挖沟布线不便或者变频器在移动设备上&#xff0c;那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例&#xff0c;并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…