9.pytest_参数化parametrize

本文详细介绍了pytest.mark.parametrize装饰器的使用方法,包括如何实现测试用例参数化,标记单个测试实例,以及如何获得多个参数化参数的所有组合。通过具体示例展示了参数化的运行结果和常见应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pytest.mark.parametrize装饰器可以实现测试用例参数化。
1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子;
注意编写格式,第一个参数是字符串输入形参,第二个参数是数组,数组中是元祖的实参;

import pytest
@pytest.mark.parametrize("a,b",[(2+2,4),(2*3,5),("静静","静静")])

def test_add(a,b):
    assert a==b

运行结果:

test_parameters.py::test_add[2-2] PASSED                                 [ 25%]
test_parameters.py::test_add[4-4] PASSED                                 [ 50%]
test_parameters.py::test_add[6-5] FAILED                                 [ 75%]
test_parameters.py:1 (test_add[6-5])
6 != 5

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

a = 6, b = 5

    @pytest.mark.parametrize("a,b",[(2,2),(2+2,4),(2*3,5),("静静","静静")])
    
    def test_add(a,b):
>       assert a==b
E       assert 6 == 5

test_parameters.py:5: AssertionError

test_parameters.py::test_add[\u9759\u9759-\u9759\u9759] PASSED           [100%]

2.它也可以标记单个测试实例在参数化,例如使用内置的mark.xfail

import pytest
@pytest.mark.parametrize("a,b",[(2+2,4),(2*3,6),
                                pytest.param("2+4",6,marks = pytest.mark.xfail)])

def test_add(a,b):
    assert a==b

运行结果:

test_parameters.py::test_add[4-4] 
test_parameters.py::test_add[6-6] 
test_parameters.py::test_add[2+4-6] 

======================== 2 passed, 1 xfailed in 0.06s =========================

Process finished with exit code 0
PASSED                                 [ 33%]PASSED                                 [ 66%]XFAIL                                [100%]
a = '2+4', b = 6

    @pytest.mark.parametrize("a,b",[(2+2,4),(2*3,6),
                                    pytest.param("2+4",6,marks = pytest.mark.xfail)])
    
    def test_add(a,b):
>       assert a==b
E       AssertionError: assert '2+4' == 6

test_parameters.py:6: AssertionError

标记为失败的用例,预期结果是失败,实际运行也是失败,显示xfailed

参数组合

1.若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

import pytest
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
    print("测试数据组合:x->%s, y->%s" % (x, y))


if __name__ == "__main__":
    pytest.main(["-s", "test_para02.py"])
  1. 运行结果:
test_para02.py::test_foo[2-0] PASSED                                     [ 25%]测试数据组合:x->0, y->2

test_para02.py::test_foo[2-1] PASSED                                     [ 50%]测试数据组合:x->1, y->2

test_para02.py::test_foo[3-0] PASSED                                     [ 75%]测试数据组合:x->0, y->3

test_para02.py::test_foo[3-1] PASSED                                     [100%]测试数据组合:x->1, y->3


============================== 4 passed in 0.02s ==============================

pytest.mark.parametrizepytest框架中的一个装饰器,用于参数化测试用例。它可以将不同的参数传递给同一个测试函数,以便多次运行测试用例。在引用\[1\]和引用\[2\]中,示例展示了如何使用pytest.mark.parametrize来传递单个变量的参数,其中引用\[1\]使用元组作为参数,引用\[2\]使用列表作为参数。而在引用\[3\]中,展示了如何结合yaml数据使用pytest.mark.parametrize。首先,通过read_yaml函数将yaml文件中的数据读取出来,并将其转换为列表形式。然后,将这个列表作为参数传递给pytest.mark.parametrize装饰器,从而实现参数化测试用例。在这个示例中,参数名为"data",并且测试函数test_add_case4可以通过"data"来访问每个测试数据中的具体值。这样,pytest框架会根据参数化的设置,多次运行测试函数,每次传递不同的参数值。 #### 引用[.reference_title] - *1* *2* [4.pytest parametrize()参数化](https://blog.csdn.net/lzmlc0109/article/details/125719941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [@pytest.mark.parametrize用法(yaml和fixture结合使用)](https://blog.csdn.net/qq_42870572/article/details/128149867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值