pytest实战技巧之参数化应用

pytest是Python中最流行的测试框架之一。它提供了丰富的功能,可以帮助我们编写高效、可靠的测试用例。其中一个重要的功能就是参数化,它可以让我们用不同的数据组合来运行同一个测试用例,从而 提高测试覆盖率和效率。本文将介绍pytest参数化的基本用法和一些高级技巧,帮助读者更好地使用这个功能。 

01 基本用法 

pytest参数化的基本用法非常简单,只需要在测试函数上添加一个装饰器@pytest.mark.parametrize, 然后指定参数名称和参数值列表即可。例如,我们有一个测试函数test_add,用来测试两个数相加的结果是否正确:

def test_add():assert add(2, 3) == 5assert add(-1, 1) == 0

现在我们想用多组数据来运行这个测试函数,可以这样做:

import pytesta, b, expected(2, 3, 5),(-1, 1, 0),(0, 0, 0),(100, -100, 0),])def test_add(a, b, expected):assert add(a, b) == expected

这里我们定义了一个参数化装饰器,指定了三个参数名称a、b和expected,以及一个参数值列表,其中每个元素都是一个包含三个值的元组,分别代表两个数和它们的和。这样,pytest就会根据这个参数值列表,自动运行测试函数四次,每次用一个元组中的数据来替换a、b和expected参数,然后执行断言操作,最后输出测试结果。 

02 参数化的多种方式 

除了上面的方式,pytest还支持多种参数化的方式,可以根据实际情况选择最合适的一种。 

  • 参数值列表 

我们已经看到了最简单的参数化方式,就是将多组参数值放在一个列表中,然后传给装饰器。这种方式适用于参数比较少、每个参数值都比较独立的情况。如果参数值之间有一定的关联性,或者参数比较 多,就不太适合使用这种方式了。 

  • 参数名称列表 

有时我们希望将参数值列表和参数名称列表分开定义,这样可以更清晰地表达参数之间的关系。例如, 我们有一个函数用来测试字符串是否包含某个子串,可以这样写:

@pytest.mark.parametrize("s, sub, expected", [("hello world", "hello", True),("hello world", "world", True),("hello world", "python", False),])def test_contains(s, sub, expected):assert (sub in s) == expected

这里我们将参数名称s、subexpected分别和参数值列表中的元组对应起来,这样就可以更直观地理解 每个参数的含义。

注意,参数名称列表也可以是一个字符串,多个参数名称之间用逗号隔开,例如:"a, b, expected"。 

  • 参数化装饰器嵌套 

有时我们需要对多个参数进行组合,这时可以使用参数化装饰器的嵌套。例如,我们有一个函数用来测试两个字符串连接后的结果是否正确,可以这样写:


@pytest.mark.parametrize("s1", ["hello", "world"])
@pytest.mark.parametrize("s2", ["python", "pytest"])def test_concat(s1, s2):assert concat(s1, s2) == s1 + s2

这里我们先用一个参数化装饰器指定s1参数的取值范围,然后在这个装饰器内部再嵌套一个参数化装饰器,指定s2参数的取值范围。这样,pytest就会自动运行测试函数四次,每次用一个s1和一个s2的组合 来测试函数的正确性。 

  • 参数化函数 

有时我们需要动态生成参数值列表,这时可以使用参数化函数。例如,我们有一个函数用来测试一个整数是否为质数,可以这样写:


def is_prime(n):if n < 2:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn True@pytest.mark.parametrize("n", range(10))
def test_is_prime(n):assert is_prime(n) == (n in [2, 3, 5, 7])

这里我们使用了Python内置的range函数来生成一个整数序列,然后将这个序列作为参数值列表传给了参数化装饰器。这样,pytest就会自动运行测试函数十次,每次用一个整数来测试函数的正确性。

  • 从文件读取参数 

有时我们需要从外部文件中读取参数值列表,这时可以使用pytest的fixture机制。例如,我们有一个CSV文件,包含了多组数据,每组数据都是一个整数和一个字符串,用逗号隔开。我们希望用这些数据 来测试一个函数,可以这样写:


import csvimport pytest@pytest.fixture(scope="module")
def data():with open("test_data.csv") as f:reader = csv.reader(f)return list(reader)@pytest.mark.parametrize("n, s", data())
def test_func(n, s):assert func(n, s) == ...

这里我们定义了一个fixture函数data,用来读取CSV文件中的数据,并返回一个列表,每个元素都是一 个包含两个值的元组。然后在测试函数的参数化装饰器中,使用data()来获取这个列表,并将其中的元 组分别赋值给n和s两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据来测 试函数的正确性。 

03 参数化的高级技巧 

除了上面介绍的基本用法和多种方式,pytest参数化还有一些高级技巧,可以帮助我们更灵活地使用这个功能。 

  • 动态生成参数名称 

有时我们需要动态生成参数名称,例如根据参数值来生成一个唯一的标识符。这时可以使用pytest的ids 参数,它可以指定每个参数值对应的参数名称。例如,我们有一个函数用来测试两个字符串连接后的长度是否正确,可以这样写:


@pytest.mark.parametrize("s1, s2, expected", [("hello", "world", 10),("pytest", "is awesome", 15),
], ids=["case1", "case2"])def test_len(s1, s2, expected):assert len(concat(s1, s2)) == expected

这里我们使用了ids参数,将每个参数值对应的参数名称指定为了一个字符串,分别 是"case1"和"case2"。这样,pytest就会在测试结果中显示这些参数名称,方便我们查看和分析测试结果。 

  • 参数化的组合 

有时我们需要对多个参数进行组合,例如测试一个函数在不同参数组合下的正确性。这时可以使用pytest的product参数化,它可以将多个参数值列表进行组合,生成所有可能的参数组合。

例如,我们有一个函数用来测试两个整数相乘的结果是否正确,可以这样写:


@pytest.mark.parametrize("a", [1, 2, 3]) @pytest.mark.parametrize("b", [4, 5, 6])
def test_mul(a, b):assert mul(a, b) == a * b@pytest.mark.parametrize("a, b", product([1, 2, 3], [4, 5, 6]))
def test_mul2(a, b):assert mul(a, b) == a * b

这里我们先用两个参数化装饰器分别指定a和b的取值范围,然后在测试函数中用a和b的乘积来进行断 言。这样,pytest就会自动运行测试函数九次,每次用一个a和一个b的组合来测试函数的正确性。另 外,我们还可以使用product函数来完成同样的功能,它可以将多个参数值列表进行组合,并返回所有可能的参数组合。

  • 动态生成参数化装饰器 

有时我们需要根据某些条件动态生成参数化装饰器,例如根据某个配置文件中的参数来决定测试函数的参数取值范围。这时可以使用pytest的fixture机制,动态生成参数化装饰器。

例如,我们有一个配置文件,包含了两个参数s和n,分别表示一个字符串和一个整数,我们希望用这些参数来测试一个函数,可 以这样写:

import yaml
import pytest@pytest.fixture(scope="module")
def config():with open("test_config.yaml") as f:return yaml.safe_load(f)@pytest.fixture(scope="module")def params(config):return [(s, n) for s in config["strings"] for n in config["numbers"]]def test_func(params):for s, n in params:assert funcs, n...

这里我们定义了两个fixture函数,config和params。

  • config用来读取配置文件中的参数

  • params用来根据这些参数动态生成参数值列表

然后在测试函数中,使用params来获取参数值列表,并将其中的元 组分别赋值给s和n两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据来测试函数的正确性。 

04 总结 

本文介绍了pytest参数化的基本用法和多种方式,帮助读者更好地使用这个功能。同时,还介绍了一些高级技巧,如动态生成参数名称、参数化的组合和动态生成参数化装饰器,帮助读者更灵活地使用参数 化。通过学习本文,读者可以更好地理解pytest参数化的原理和用法,从而编写更高效、可靠的测试用例。

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

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

相关文章

微软蓝屏事件:全球IT基础设施的韧性考验与未来展望

在数字化时代&#xff0c;信息技术的飞速发展极大地推动了社会进步与产业升级&#xff0c;但同时也让全球IT基础设施的韧性与安全性面临着前所未有的挑战。近日&#xff0c;一场由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅震撼了整个科技界&#xff0…

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全…

数据结构中的八大金刚--------八大排序算法

目录 引言 一&#xff1a;InsertSort(直接插入排序) 二&#xff1a;ShellSort(希尔排序) 三&#xff1a;BubbleSort(冒泡排序) 四&#xff1a; HeapSort(堆排序) 五&#xff1a;SelectSort(直接选择排序) 六&#xff1a;QuickSort(快速排序) 1.Hoare版本 2.前后指针版本 …

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用mybatis-plus的generator工程生成PO类、Mapper接口、Mapper的xml文件 模块工程 模型类的作用 课程查询接口 controller ApiOperation("课程查询接口&qu…

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章&#xff1a; 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步&#xff1a;PyCharm下载 第二步&#xff1a;安装&#xff08;点击安装包打开下图页面&#xff09; 第三步&#xff1a;科学使用&#xff0c;请前往下载最新工具及教程&#xff1a…

【安卓开发】【Android】如何进行真机调试【注意事项】

一、所需原料 1、电脑&#xff08;安装有Android Studio开发工具&#xff09;&#xff1a; 2、安卓操作系统手机&#xff1a;笔者演示所用机型为huawei rongyao50&#xff0c;型号为NTU-AN00&#xff1a; 3、数据线&#xff08;usb-typeA&#xff09;一根。 二、操作步骤 1…

商汤提出的BRECQ量化框架是个什么?

商汤提出的BRECQ量化框架是个什么&#xff1f; 引言 近年来&#xff0c;深度学习在多个领域取得了显著进展&#xff0c;但其巨大的计算成本和内存占用问题逐渐凸显。为了压缩和加速已训练好的网络&#xff0c;量化成为了一种重要的技术手段。量化主要分为两类&#xff1a;量化…

IDEA插件:mybatis log plus,完整SQL语句输出插件

背景 idea中&#xff0c;我们开发项目时&#xff0c;在控制台中都会有日志输出&#xff0c;操作数据库也会有对应的SQL输出。 不过在控制台输出的SQL&#xff0c;不管增删改查&#xff0c;如果有传参&#xff0c;参数一般都是需要我们自己拼接&#xff0c;形成一个完整的、可…

华清数据结构day4 24-7-19

链表的相关操作 linklist.h #ifndef LINKLIST_H #define LINKLIST_H #include <myhead.h> typedef int datatype; typedef struct Node {union{int len;datatype data;};struct Node *next; } Node, *NodePtr;NodePtr list_create(); NodePtr apply_node(datatype e); …

基于微信小程序+SpringBoot+Vue的刷题系统(带1w+文档)

基于微信小程序SpringBootVue的刷题系统(带1w文档) 基于微信小程序SpringBootVue的刷题系统(带1w文档) 本系统是将网络技术和现代的管理理念相结合&#xff0c;根据试题信息的特点进行重新分配、整合形成动态的、分类明确的信息资源&#xff0c;实现了刷题的自动化&#xff0c;…

HTML学习 - 表格

<table><tr><th>姓名</th><th>年龄</th><th>性别</th></tr><tr><td>张三</td><td>11</td><td>男</td></tr><tr><td>李三</td><td>21</td&…

matlab SAR图像的多视滤波

目录 一、算法原理1、概述2、时域多视滤波3、频域多视滤波4、参考文献 二、代码实现1、时域多视滤波 三、结果展示四、相关链接 一、算法原理 1、概述 单视复数数据&#xff08;Single Look Comple&#xff09;是原始的最高分辨率数据&#xff0c;但是从单个像元散射的雷达回波…

如何使用捕获过滤器

点击捕获&#xff0c;选项&#xff0c;然后在所选择的捕获过滤器上输入对应的捕获表达式 抓包过滤器 type(类型) 限定符: 比如host&#xff0c;net&#xff0c;port限定符等dir(方向) 限定符: src dstProto(协议类型)限定符: ether ip arp 二层过滤器举例 tcp dst port 135 …

K3s部署及研究

K3s部署及研究 K3s和K8s详解什么是 Kubernetes (K8s)?什么是 K3s?对比 K8s 和 K3s举个例子1、备份系统自带yum源配置文件2、进入 /etc/yum.repos.d3、删除文件4、设置5、缓存 查看集群是否正常 安装K3S Node节点查看主节点token获取主节点服务地址 添加node节点查看节点状态 …

python—selenium爬虫

文章目录 Selenium与Requests对比一、工作原理二、功能特点三、性能表现 下载对应驱动1.首先我们需要打开edge浏览器&#xff0c;打开设置&#xff0c;找到“关于Microsoft Edge”&#xff0c;点击进入查看浏览器版本。2.查找版本之后&#xff0c;搜索edge驱动下载&#xff0c;…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

STM32CUBEIDE FreeRTOS操作教程(一):LED闪灯

STM32CUBEIDE FreeRTOS操作教程&#xff08;一&#xff09;&#xff1a;LED闪灯 STM32CUBEIDE(不是STM32CUBEMX)开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…

PCB工艺边设计准则

在PCB设计时&#xff0c;通常会在电路板的边缘预留一定的空间&#xff0c;这部分空间被称为工艺边。它有助于在生产过程中确保电路板的尺寸和形状的准确性。以使得组装时更加顺畅、便捷。而工艺边的加工&#xff0c;使得线路板上的元件可以精准地与设备对接&#xff0c;从而提高…

springboot系列十一:Thymeleaf

文章目录 官方文档基本介绍Thymeleaf机制说明Thymeleaf语法表达式运算符th属性迭代条件运算使用Thymeleaf th属性需要注意点 Thymeleaf综合案例需求说明思路分析代码实现 作业布置 官方文档 在线文档: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 离线…

DNS域名管理系统、搭建DNS服务

1.DNS概述 1.DNS&#xff08;domain name system &#xff09; 域名管理系统 域名&#xff1a; 由特定的格式组成&#xff0c;⽤来表示互联⽹中某⼀台计算机或者计算机组的名称&#xff0c;能够使⼈更⽅便的访问互联⽹&#xff0c;⽽不⽤记住能够被机器直接读取的IP地址。 计算…