pytest钩子函数(二):初始化钩子

news2024/11/24 17:53:01

前言

pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预,根据需求去开发对应的插件,以满足自己的使用场景。

01 什么是钩子函数?

钩子函数在pytest称之为Hook函数,它pytest框架的开发者,为了让用户更好的去扩展开发预留的一些函数。而预留的这些函数,在整个测试执行的生命周期中特定的阶段会自动去调用执行。如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJh4ShrP-1689820417032)(/api/attachments/426316)]

pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收集钩子、用例执行钩子、报告钩子、调试钩子。

详细文档可以查看pytest官方文档https://docs.pytest.org/en/latest/reference/reference.html?highlight=hook#hooks

02 初始化钩子

初始化钩子用来调用插件和conftest.py文件的初始化。

2.1 pytest_addoption

参数

  • parser :参数解析器
  • pluginmanager :插件管理器

触发时机:

  • conftest文件加载完之后执行, 在测试运行开始时调用一次。

作用:

  • 添加运行命令的命令行参数,pytest.ini的配置参数。

2.1.1 parser.addoption

pytest_addoption 钩子函数可以让用户注册一个自定义的命令行参数,以便于用户在测试开始前将数据从外部(如:控制台)传递给程序。


parser.addoption 方法接收以下几个参数:

  • name:自定义命令行参数的名字,可以是短选项(例如 -n)或长选项(例如 --name)。
  • action:在命令行中遇到此参数时要采取的存储该参数对应的参数值的基本操作类型;
  • default:如果参数不在命令行中,则生成的默认值。
  • dest:要添加到 parse_args() 返回的对象中的属性的名称;
  • type:注册的自定义到pytest配置对象中的命令行参数对应的参数值应该转换为的类型;可以是 int、float、str 等类型,默认为 str。
  • choices:参数允许值的容器;传递了 choices 参数后,只有在选项的值在这个列表中时才会被接受。
  • help:对参数作用的简要说明;将在命令行中显示帮助信息时使用。
  • nargs:应该使用的命令行参数的数量;
  • const:某些操作和nargs选择所需的常量值;
  • required:命令行选项是否可以省略(仅可选);
  • metavar:用法消息中参数的名称;

其中action参数有几个预定义的选项可供选择,包括:
  • store(默认): 将选项值存储到相应的目标变量中。
  • store_const: 存储一个常量值到相应的目标变量中。
  • store_true: 存储 True 到相应的目标变量中。
  • store_false: 存储 False 到相应的目标变量中。
  • append: 将多个值追加到相应的目标变量中,用于处理多次出现的选项。
  • count: 计算选项的出现次数,并将次数存储到相应的目标变量中。
2.1.1.1 通过自定义命令行参数-env设置当前运行的环境
# conftest.py
def pytest_addoption(parser, pluginmanager):
    parser.addoption(
        "--env",
        dest="env_value",
        action="store",
        default="test",
        choices=["test", "live"],
        help="通过自定义命令行参数-env设置当前运行的环境"
    )

# ----------------------------------------------------------------------------#
# test_demo.py
import pytest

cases = [
    {"id": 1, "title": "demo 001", "username": "flora"},
    # {"id": 2, "title": "demo 002", "username": "lucy"},
]


class TestDemo:

    @pytest.mark.parametrize("case", cases)
    def test_demo(self, case, request):
        env = request.config.getoption("env_value")  
		# 由于 parser.addoption存在参数dest因此需要使用dest的值来获取命令行参数的值,如果没有dest,则可以采用env = request.config.getoption("env")获取命令行参数的值
        print("获取到的env的值:", env)
        assert case["username"] == "flora"

通过命令pytest -s --env=live运行测试,结果如下:

2.1.2 parser.addini

parser.addini 方法用于向解析器添加配置文件选项。parser.addini 方法可以接收以下参数:

  • name(必需):配置选项的名称,它应该是一个字符串。
  • help(可选):配置选项的帮助文本,用于描述配置选项的作用和使用方法。
  • type(可选):配置选项的类型,默认为字符串类型。
  • default(可选):配置选项的默认值,如果用户没有在配置文件中指定该选项,则将使用默认值。
  • **kwargs(可选):其他关键字参数,用于进一步自定义配置选项。
2.1.2.1 往pytest配置文件中添加参数
# conftest.py
import pytest


def pytest_addoption(parser, pluginmanager):
    parser.addoption(
        "--env",
        # dest="env_value",
        action="store",
        default="test",
        choices=["test", "live"],
        help="通过自定义命令行参数-env设置当前运行的环境"
    )
    parser.addini(
        'live_host',
        type="string",
        default="https://www.gitlink.org.cn/",
        help='正式环境域名'
    )
    parser.addini(
        'test_host',
        type="string",
        default="https://www.test.org.cn/",
        help='测试环境域名'
    )


# 获取 pytest.ini 配置参数
@pytest.fixture(scope="session")
def get_host(pytestconfig, request):
    env = request.config.getoption("env")
    if env == "test":
        host = pytestconfig.getini('test_host')
    elif env == "live":
        host = pytestconfig.getini('live_host')
    else:
        host = ""
    print(f"\n当前环境域名是:{host}")

通过命令pytest -s --env=live运行测试,结果如下:
在这里插入图片描述

2.2 pytest_configure

参数

  • config:pytest 配置对象,提供了许多方法和属性来获取和修改 pytest 的配置选项。例如,可以使用 config.getoption(name) 来获取命令行选项的值,使用 config.getini(name) 来获取配置文件选项的值。

触发时机:

  • 在解析命令行选项后,每个插件和初始 conftest 文件都会调用此钩子,
  • 在导入其他 conftest 文件时调用该钩子。

默认作用:

  • 允许插件和 conftest 文件执行初始配置。

2.2.1 往配置文件中添加自定义标记并读取所有标记

# conftest.py
def pytest_addoption(parser, pluginmanager):
    parser.addoption(
        "--env",
        # dest="env_value",
        action="store",
        default="test",
        choices=["test", "live"],
        help="通过自定义命令行参数-env设置当前运行的环境"
    )


def pytest_configure(config):
    # 获取命令行选项的值
    my_option = config.getoption('env')
    print(f"获取到的命令行选项值为:{my_option}")

    # 添加自定义配置
    config.addinivalue_line("markers", "demo: democase")
    print("已添加自定义标记 'custom_marker'")

    # 获取配置文件选项的值
    my_ini_option = config.getini('markers')
    print(f"获取到的配置文件选项值为:{my_ini_option}")
# test_demo.py
import pytest

cases = [
    {"id": 1, "title": "demo 001", "username": "flora", "age": 17},
    # {"id": 2, "title": "demo 002", "username": "lucy", "age": 18},
]


class TestDemo:

    @pytest.mark.demo
    @pytest.mark.parametrize("case", cases)
    def test_demo_01(self, case):
        assert case["username"] == "flora"
	
	@pytest.mark.parametrize("case", cases)
    def test_demo_02(self, case):
        assert case["age"] == 18

通过命令pytest -s --env=live -m=demo运行测试,结果如下:
在这里插入图片描述

2.3 pytest_unconfigure

参数

  • config:pytest配置对象。

触发时机:

  • 在退出测试过程之前调用。

2.4 pytest_sessionstart

参数

  • session:pytest 会话对象,它提供了许多方法和属性来获取和修改测试会话的各种信息。例如,可以使用 session.config 来访问 pytest 的配置对象,使用 session.items 获取当前会话中的测试项,以及使用其他方法来处理测试会话相关的信息。

触发时机:

  • 在创建 Session 对象之后、执行收集测试用例之前调用。

以下是一些常用的 session 属性和方法:
  • session.config:获取当前 pytest 配置对象,可以使用它来获取和修改 pytest 的配置选项。
  • session.shouldstop:用于判断是否应该停止测试会话。在测试过程中,可以设置 session.shouldstop = True 来提前终止测试会话。
  • session.testsfailed:获取测试失败的数量。

2.5 pytest_sessionfinish

参数:

  • session:pytest 会话对象。
  • exitstatus:pytest 将返回系统的状态。

触发时机:

  • 在整个测试运行完成后调用,就在将退出状态返回给系统之前。

以下是一些常用的 session 属性和方法:
  • session.config:获取当前 pytest 配置对象,可以使用它来获取和修改 pytest 的配置选项。
  • session.shouldstop:用于判断是否应该停止测试会话。在测试过程中,可以设置 session.shouldstop = True 来提前终止测试会话。
  • session.testsfailed:获取测试失败的数量。

2.6 pytest_plugin_registered

参数

  • plugin :插件模块或实例。
  • manager :pytest 插件管理器。

作用:

  • 注册一个新的插件。

2.7 pytest_addhooks

参数

  • pluginmanager :插件管理器。

触发时机:

  • 注册插件时调用,添加钩子函数到执行列表。

默认作用:

  • 调用 pluginmanager.add_hookspecs(module_or_class, prefix) 注册插件。

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

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

相关文章

【头歌】二叉树的二叉链表存储及基本操作

第1关:先序遍历创建二叉链表存储的二叉树及遍历操作 任务描述 本关任务:以二叉链表作存储结构存储二叉树,利用先序递归遍历创建二叉树,并依次进行二叉树的前序、中序、后序递归遍历。 相关知识 在顺序存储结构中,利用数组下标表示元素的位置及元素之间孩子或双亲的关系…

失去中国市场的三星继续称霸全球,中国手机的份额反而进一步下降了

市调机构canalys公布了二季度全球手机市场的数据,数据显示三星、苹果的市场份额保持稳定并位居全球前二,三星的表现显然让人称奇,一直被唱衰,却一直都稳稳占据全球手机市场第一名。 从Canalys公布的数据可以看到,三星以…

【Go】 map 精髓理解

map go map 的底层结构 hmap,的四个元素 然后再讲一下 buckets 的元素,讲一下 hash 冲突,和解决方法 再讲一下,增量扩容和等量扩容 再讲一下增删改查的过程,就查询过程 map 基础 向值为 nil 的 map 添加元素会发生 pa…

青枫壁纸小程序V1.4.0(后端SpringBoot)

引言 那么距离上次的更新已经过去了5个多月,期间因为忙着毕业设计的原因,更新的速度变缓了许多。所以,这次的更新无论是界面UI、用户功能、后台功能都有了非常大的区别。希望这次更新可以给用户带来更加好的使用体验 因为热爱,更…

【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 全衍射3-D传播模拟器是一种用于模拟在具有随机和背景结构的介质中传播无线电和光的工具。它可以帮助研究人员和工程师理解和预测无线电波和光波…

多重感知机MLP:Mnist

文章目录 网络结构代码common_utils.pynetwork.pyprovider.pytrain.pytest.pyvisual.py 实验训练结果测试结果可视化 网络结构 输入过程输出28*28Flatten784784Linear300300Linear100100Linear10 代码 文件结构: common_utils.py 用来输出日志文件 # common_…

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计

1 主要内容 该程序对应文章《Power System Dynamic State Estimation Using Extended and Unscented Kalman Filters》,电力系统状态的准确估计对于提高电力系统的可靠性、弹性、安全性和稳定性具有重要意义,虽然近年来测量设备和传输技术的发展大大降低…

Linux常用嗅探工具(1):fping命令

fping的优点: 可以一次ping多个主机可以从主机列表文件ping结果清晰 便于脚本处理速度快 fping的安装: 前置安装cgg编译器 : yum -y install gcc 下载fping: wget http://fping.org/dist/fping-4.0.tar.gz 解压: …

力扣 -- 918. 环形子数组的最大和

一、题目: 题目链接:918. 环形子数组的最大和 - 力扣(LeetCode) 二、解题步骤: 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码&#xff1…

Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

F---图像识别---河南省第十三届ICPC大学生程序设计竞赛

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 输入 10 10 ........*. ........*. ........*. ........*. ....#...*. ........*. ........*. ********** ........*. ........*. 输出 -4 3 解析: 遍历整个二维数组&#xff0…

dubbo从基于注解方式转为基于xml配置方式的使用心得

过程中遇到的问题百分之九十九的问题都是因为版本不兼容问题,所以在引入依赖的时候要注意这点,可以从maven central repository官方仓库这里看所要引用版本与其可兼容的版本

畅想未来感汽车HMI设计的奇妙之旅!

当下智能电动汽车的发展势头越来越高涨,与智能电动汽车相关的汽车HMI设计也成为各个品牌重点发力的地方,汽车HMI设计正在前所未有的新高度,本篇文章就来聊聊HMI设计的那些事 ⬇⬇⬇点击获取更多设计资源 https://js.design/community?categ…

prometheus监控mysql8.x以及主从监控告警

mysql8.x主从部署请看下面文档 docker和yum安装的都有 Docker部署mysql8.x版本互为主从_争取不加班!的博客-CSDN博客 Mysql8.x版本主从加读写分离(一) mysql8.x主从_myswl8双主一从读写分离_争取不加班!的博客-CSDN博客 安装部署…

C++OpenCV(4):图像截取与掩膜操作

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 文章目录 图像截取图像掩膜操作 图像截取 ROI操作,指的是:region of interest,感兴趣区域。 我们可以对一张…

Vue 项目增加版本号输出, 可用于验证是否更新成功

webpack 1. vue.config.js 中增加以下配置, 此处以增加一个日期时间字符串为例, 具体内容可以根据自己需求自定义 // vue.config.js module.exports {chainWebpack(config) {config.plugin(define).tap(args > {args[0][process.env].APP_VERSION ${JSON.stringify(new …

行为型模式--模版方法模式(图文详解)

模版方法模式--图文详解 采摘机器人-场景体验模版方法模式-解决问题模版方法模式-定义优缺点优点缺点 采摘机器人-场景体验 今天看抖音上外国开始使用采摘苹果的机器人,我们模仿一下的他的大体流程: 主体采摘车进入苹果园进入苹果指定采摘地点&#xf…

通过自动化单元测试的形式守护系统架构

目录 0前言 1 背景 2 为什么选择 Archunit 3 Archunit 是什么 4 引入 Archunit 4.1 开始就是如此简单 4.2 如何组织架构规则 4.3 团队如何规范化 0前言 通过自动化单元测试的形式守护系统架构是一种有效的方式,可以确保系统在不断演进和修改的过程中保持稳…

Python实战之数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

全文链接:http://tecdat.cn/?p23061 这个数据集(查看文末了解数据免费获取方式)可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0无…