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,一经查实,立即删除!

相关文章

香薰学习笔记

1 喷香水的方法 ChatGPT-4o 学习使用香水是提升个人形象的一个好方法。 喷香水的方法如下&#xff1a; 皮肤吸收&#xff1a;香水最好喷在皮肤上&#xff0c;因为皮肤的温度能帮助香水散发出更好的香味。喷在衣服上可能会影响香水的原始味道。脉搏点&#xff1a;将香水喷在脉搏…

springSecurity学习之springSecurity用户单设备登录

用户只能单设备登录 有时候在同一个系统中&#xff0c;只允许一个用户在一个设备登录。 之前的登陆者被顶掉 将最大会话数设置为1就可以保证用户只能同时在一个设备上登录 Override protected void configure(HttpSecurity http) throws Exception {http..anyRequest().aut…

微软蓝屏事件:全球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.前后指针版本 …

JNI回调用中不同线程的env无法找到正确的kotlin的class

不同线程都需要通过 JavaVM 获取到的 JNIEnv 指针&#xff0c; 如果有两个线程有两个 env。 其中一个是jni接口自己传过来的&#xff0c;可以正常使用&#xff0c;正常获取kotlin中的class。但是通过 JavaVM 新获取的env 无法找到kotlin的class 1. 确保线程已附加到 JVM 确保…

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用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;形成一个完整的、可…

Lottie:动态动画的魔法棒

文章目录 引言官网链接Lottie 的原理基础使用1. 导出动画2. 引入 Lottie 库3. 加载和播放动画 高级使用1. 动画控制2. 交互性3. 自定义动画例子&#xff1a;交互式按钮动画 优缺点优点缺点 结语 引言 Lottie 是 Airbnb 开源的一个动画库&#xff0c;它允许设计师在 Adobe Afte…

三极管和MOS管,二者的主要区别

1、工作性质&#xff1a;三极管用电流控制&#xff0c;MOS管属于电压控制. 2、成本问题&#xff1a;三极管便宜&#xff0c;mos管贵。 3、功耗问题&#xff1a;三极管损耗大。 4、驱动能力&#xff1a;mos管常用来电源开关&#xff0c;以及大电流地方开关电路。 三极管比较…

在Ubuntu子系统上安装宝塔面板(BT Panel)

在Ubuntu子系统上安装宝塔面板&#xff08;BT Panel&#xff09;&#xff0c;可以按照以下步骤进行&#xff1a; 更新系统软件包&#xff1a; 打开Ubuntu终端&#xff0c;输入以下命令更新系统软件包&#xff1a; sudo apt update && sudo apt upgrade -y安装必备的软件…

华清数据结构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); …

前端常用简化开发的框架和组件

一.BootStrap框架 BootStrap官网直达 Bootstrap是一个强大且易于使用的前端框架&#xff0c;适合各种规模的项目。它的响应式设计、丰富的组件和灵活的布局系统&#xff0c;使得开发者能够高效地构建现代化的网站。无论是初学者还是经验丰富的开发者&#xff0c;Bootstrap都能…

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

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

scikit-learn中fit_transform会改变原始数据吗

在 Python 的 scikit-learn 库中&#xff0c;fit_transform 方法通常用于数据预处理阶段&#xff0c;比如在标准化、归一化、进行主成分分析&#xff08;PCA&#xff09;或其他转换时使用。这个方法同时执行 fit 方法和 transform 方法&#xff1a; fit&#xff1a;计算训练数…

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&…

springboot给属性赋值的两种方式(yaml与properties)

一&#xff0c;介绍 在Spring Boot中&#xff0c;配置文件是用来设置应用程序的各种参数和操作模式的重要部分。Spring Boot支持两种主要类型的配置文件&#xff1a;properties文件和YAML 文件。这两种文件都可以用来定义相同的配置&#xff0c;但它们在格式和表达能力上有所不…