Python基础教程之 基础教程之pytest参数化详解 参数化详解 ⽬录 ⽬录 前⾔ 源代码分析 装饰测试类 装饰测试函数 单个数据 ⼀组数据 组合数据 标记⽤例 嵌套字典 增加测试结果可读性 总结 前⾔ 前⾔ 上篇博⽂介绍过,pytest是⽬前⽐较成熟功能齐全的测试框架,使⽤率肯定也不断攀升。在实际 ⼯作中,许多测试⽤例都是类似的重复,⼀个个写最后代码会显得很冗余。这⾥,我们来了解⼀下 @pytest.mark.parametrize装饰器,可以很好的解决上述问题。 源代码分析 源代码分析 def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None): """ Add new invocations to the underlying test function using the list of argvalues for the given argnames. Parametrization is performed during the collection ph 在Python的测试领域,pytest框架以其强大的功能和易用性深受开发者喜爱。本文将深入探讨pytest中的一个重要特性——参数化,以帮助读者更好地理解和利用这一功能优化测试代码,提高工作效率。 参数化允许我们通过单一的测试函数执行多次,每次用不同的参数组合。这样可以避免编写大量重复的测试用例,使得代码更加简洁且易于维护。pytest提供了`@pytest.mark.parametrize`装饰器来实现这一功能。 我们来看`parametrize`方法的基本结构。这个方法接受四个主要参数: 1. `argnames`: 这是一个表示一个或多个参数名的字符串(用逗号分隔)或者列表/元组。例如,如果你有两个参数`x`和`y`,你可以传入`"x,y"`或者`['x', 'y']`。 2. `argvalues`: 这是一个列表,决定了测试函数被调用的不同参数值。如果只有一个`argname`,`argvalues`是一个值列表;如果有多个`argname`,则`argvalues`应为一个包含相应数量元组的列表,每个元组对应一组参数值。 3. `indirect`: 这是一个布尔值或参数名列表。如果设置为True,表示所有`argnames`中的参数将在测试的设置阶段通过`request.param`传递给相应的fixture函数,以进行更复杂的设置操作,而不是在收集阶段。若提供参数名列表,只有这些参数名的值会被间接传递。 4. `ids`: 这可以是一个字符串列表,或者一个接受一个参数的可调用对象。字符串列表中的每个元素与`argvalues`中的值对应,用于自定义测试ID。如果某个测试的ID为None,pytest将自动为该参数生成ID。如果`ids`是可调用的,它应该接收一个参数并返回一个字符串,作为测试ID。 举个例子,假设我们有一个简单的加法函数`add(a, b)`,我们想要测试不同数值组合的加法结果,可以这样写测试: ```python import pytest def add(a, b): return a + b @pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (0, -1, -1), (5, 7, 12)]) def test_add(a, b, expected): assert add(a, b) == expected ``` 在这个例子中,`test_add`函数将被执行三次,每次用不同的参数组合(1, 2, 3),(0, -1, -1),(5, 7, 12)。这样,我们无需为每一种情况编写单独的测试函数。 此外,`pytest.mark.parametrize`还支持使用嵌套字典来组织更复杂的数据集,以及通过`ids`参数提供更有意义的测试ID,以提高测试报告的可读性。 pytest的参数化功能是测试自动化中的强大工具,它极大地简化了重复测试用例的编写,提高了代码的复用性和可维护性。通过深入理解和熟练运用`@pytest.mark.parametrize`装饰器,我们可以编写出高效、整洁的测试代码,确保软件质量的同时,提升开发效率。
- 粉丝: 111
- 资源: 9354
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- dnSpy-net-win32-222.zip
- mongoose-free-6.9
- 德普微一级代理 DP100N06MGL PDFN3.3*3.3 TRMOS N-MOSFET 60V, 8mΩ, 45A
- 【java毕业设计】SpringBoot+Vue幼儿园管理系统 源码+sql脚本+论文 完整版
- 德普微一级代理 DP021N03FGLI DFN5*6 DPMOS N-MOSFET 30V 180A 1.8mΩ
- 巨潮资讯网5000只股票orgId-dict加密字典
- 基于java实现的快速排序代码
- 德普微一级代理 DP3145D SOT23-6 USB PD 协议单口控制器
- 【一文搞懂:什么是集成学习-原理+python代码】
- 国际象棋检测7-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar