写点什么

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

  • 2024-01-05
    北京
  • 本文字数:1414 字

    阅读完需:约 5 分钟

前言

当我们要使用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] PASSEDtest_c.py::TestParams::test_par1[2] PASSEDtest_c.py::TestParams::test_par1[3] PASSEDtest_c.py::TestParams::test_par1[4] PASSEDtest_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] PASSEDtest_c.py::TestParams::test_par1[3-4-5] FAILEDtestcase2\test_c.py:19 (TestParams.test_par1[3-4-5])7 != 5
Expected :5Actual :7<Click to see difference>
self = <testcase2.test_c.TestParams object at 0x000001789DB13108>, a = 3, b = 4c = 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)==cE assert 7 == 5E + where 7 = add(3, 4)
test_c.py:22: AssertionError




test_c.py::TestParams::test_par1[1-3-4] PASSEDtest_c.py::TestParams::test_par1[2-5-7] PASSED
========================= 1 failed, 3 passed in 0.06s =========================
复制代码


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

总结

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


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


用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用_霍格沃兹测试开发学社_InfoQ写作社区