软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用

发布时间 2024-01-10 18:59:42作者: 霍格沃兹测试开发学社

前言

当我们要使用pytest输入多个数据对一个功能进行测试时,如果写多个测试用例的话,那就完全体现不出通过代码来执行测试的优势了,这个时候,就轮到pytest的参数化功能闪亮登场了。所谓参数化,就是就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱动的概念。本文就给大家介绍一下pytest的参数化和数据驱动。

参数化方式

unittest中,我们使用ddt库配合unittest实现数据驱动,在pytest中并不需要额外的库,通过pytest.mark.parametrize()即可实现参数化。parametrize()的第一个参数是用逗号分割的字符串列表,第二个参数是一个值列表。

pytest有三种传参方式:

  • @pytest.mark.parametrize() 通过装饰器方式进行参数化(最常使用)
  • pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数
  • conftest.py文件中存放参数化函数,可作用于模块内的所有测试用例

单个传参

示例代码如下:

import pytest

def add(a,b):
    return a+b

class TestParams:

    @pytest.mark.parametrize('a',[1,2,3,4,5])
    def test_par1(self,a):
        assert add(a,1)==a+1

执行结果如下:

============================= test session starts =============================
collecting ... collected 5 items

test_c.py::TestParams::test_par1[1] PASSED
test_c.py::TestParams::test_par1[2] PASSED
test_c.py::TestParams::test_par1[3] PASSED
test_c.py::TestParams::test_par1[4] PASSED
test_c.py::TestParams::test_par1[5] PASSED

============================== 5 passed in 0.04s ==============================

注:@pytest.mark.parametrize() 装饰器接收两个参数,第一个参数是以字符串的形式标识用例函数的参数,第二个参数以列表或元组的形式传递测试数据。

多个传参

示例代码如下:

import pytest

def add(a,b):
    return a+b

class TestParams:

    @pytest.mark.parametrize('a,b,c',[[1,2,3],[3,4,5],[1,3,4],[2,5,7]])
    def test_par1(self,a,b,c):
        assert add(a,b)==c

运行结果如下:

============================= test session starts =============================
collecting ... collected 4 items

test_c.py::TestParams::test_par1[1-2-3] PASSED
test_c.py::TestParams::test_par1[3-4-5] FAILED
testcase2\test_c.py:19 (TestParams.test_par1[3-4-5])
7 != 5

Expected :5
Actual   :7
<Click to see difference>

self = <testcase2.test_c.TestParams object at 0x000001789DB13108>, a = 3, b = 4
c = 5

    @pytest.mark.parametrize('a,b,c',[[1,2,3],[3,4,5],[1,3,4],[2,5,7]])
    def test_par1(self,a,b,c):
>       assert add(a,b)==c
E       assert 7 == 5
E        +  where 7 = add(3, 4)

test_c.py:22: AssertionError





test_c.py::TestParams::test_par1[1-3-4] PASSED
test_c.py::TestParams::test_par1[2-5-7] PASSED

========================= 1 failed, 3 passed in 0.06s =========================

注:有多个参数时,参数之间要用逗号分隔,参数名称和个数要一一对应

总结

参数化测试是pytest中一个强大的功能,可以帮助开发者更高效地编写测试用例,提高代码覆盖率,并简化测试代码。后续我们还将介绍使用yaml等文件来实现更高层次的参数化和数据驱动测试,希望本文能够帮到大家!

获取更多技术资料,请点击!

推荐

Python全栈开发与自动化测试开发班
由浅入深实战进阶,从小白到高手

以Python全栈开发为基础,深入教授自动化测试技能,为学员打造全面的技术能力。通过系统学习和实际项目实战,学员将具备在职场中脱颖而出的竞争力。不仅能够灵活运用Python进行开发,还能够保障项目质量通过自动化测试手段。这是一个全面提升职业竞争力的机会。

课程详情
Python开发必备基础技能与项目实战
Pvthon 编程语言/算法和数据结构/面向对象编程Web后端开发/前端开发/测试管理平台项目实战

人工智能ChatGPT实战
人工智能辅助学习各种开发和测试技能/Pytorch深度学框架/平台开发实战

数据分析与自动化办公
数据采集/Pandas与数据处理技术/ECharts与数据可视化技术/爬虫实战/自动化办公/批量文件处理

UI自动化测试与高级项目实战
Web自动化测试/App自动化测试/ PageObject设计模式

接口自动化测试
接口协议分析/Mock实战/服务端接口测试

性能测试
性能测试流程与方法/JMeter 脚本参数化/Grafana监控系统搭建

简历指导与模拟面试
1V1简历指导/模拟真实面试/测试开发岗面试全攻略名企私教服务
名企专家1v1辅导/行业专家技术指导/针对性解决工作难题/绩效提升辅导与晋升复盘

课程亮点
名企私教服务 先学习后付费 高额奖学金
专属社群+晚自习在线答疑
5V1全方位辅导作业+考试强化学习效果
简历修改 模拟面试 就业内推 面试复盘