pytest—pytest.mark.parametrize的使用

本文详细介绍了如何在Pytest中使用@mark.parametrize进行测试用例参数化,包括单值、多值、混合参数、字典数据和标记示例,并展示了不同场景的代码示例及运行结果。

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

一、前言

我们这篇文章呢来讲讲pytest.mark.parametrize的使用,大家都知道Pytest中装饰器@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化,类似DDT,废话我就不多说了,咱么直接开始吧。

二、如何使用

  • 第一个参数是字符串,多个参数中间用逗号隔开
  • 第二个参数是list,多组数据用元组类型;传三个或更多参数也是这样传。list的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应
  • 传一个参数 @pytest.mark.parametrize('参数名',list) 进行参数化
  • 传两个参数@pytest.mark.parametrize('参数名1,参数名2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])]) 进行参数化

1、一个参数一个值

示例代码如下:

Python

# 一个参数一个值
@pytest.mark.parametrize("input", ["输入值"])
def test_case1(input):
    print("\n" + input)
    assert input == "输入值

运行结果如下图:

 

2、一个参数多个值

示例代码如下:

python

@pytest.mark.parametrize("input", ["输入值1", "输入值2", "输入值3", "输入值4", "输入值5"])
def test_case2(input):
    print("\n" + input)
    assert '输入值' in input

运行结果如下:

 3、多参数多值

示例代码如下:

python

@pytest.mark.parametrize("userName,passWord",
                         [("xiaqiang", "123456"), ("rose", "123456"), ("jone", "123456"), ("Alix", "123456")])
def test_login(userName, passWord):
    print(userName + " : " + passWord)
    assert userName == 'rose'

运行结果如下:

 

4、多个参数的混合使用

有点类似笛卡尔积的意思,示例代码如下:

python

data1 = [1, 2]
data2 = ["python", "java"]
data3 = ["暴", "躁", "测", "试", "君"]


@pytest.mark.parametrize("a", data1)
@pytest.mark.parametrize("b", data2)
@pytest.mark.parametrize("c", data3)
def test_case3(a, b, c):
    print(f"生成新的数据组合为:[{a} {b} {c}]")

运行结果如下:

 

5、参数化 ,传入字典数据

示例代码如下:

python

json=({"username":"alex","password":"123456"},{"username":"rongrong","password":"123456"})
@pytest.mark.parametrize('json', json)
def test_parametrize_1(json):
    print(f'字典为\n{json}')
    print(f'username : {json["username"]}, password : {json["password"]}')

运行结果如下:

 

6、参数化集合标记的使用

示例代码如下:

python

@pytest.mark.parametrize("user,pwd",
                         [("xiaoqiang", "123456"), ("rose", "123456"),
                          pytest.param("jone", "123456", marks=pytest.mark.xfail),
                          pytest.param("Alex", "123456", marks=pytest.mark.skip)])
def test_login(user, pwd):
    print(user + " : " + pwd)
    assert user == "rose"

运行结果如下:

 

好了今天的分享就到这里了,喜欢的可以给我点点关注和点赞哟。

 

### 使用 `pytest.mark.parametrize` 和 Allure 报告进行参数化测试 为了在使用 Allure 报告时有效地利用 `pytest.mark.parametrize` 进行参数化测试,可以遵循最佳实践来确保每个测试案例都能清晰地展示在 Allure 报告中。下面提供了一个具体的实现方式。 #### 设置动态标题和描述 通过设置动态标题和描述可以使生成的 Allure 报告更加直观易读。这可以通过调用 `allure.dynamic.title()` 方法为每一个由参数化产生的实例指定唯一的名称[^2]。 ```python import allure import pytest testdata = [ ("case1", "description of case 1"), ("case2", "description of case 2"), ] @pytest.mark.parametrize("case_name, description", testdata) def test_main(case_name, description): with allure.step(f"Executing {case_name}"): allure.dynamic.title(case_name) allure.dynamic.description(description) # 测试逻辑... assert True ``` 此代码片段展示了如何将测试数据作为元组列表传递给 `@pytest.mark.parametrize` 装饰器,并且对于每次迭代都会更新当前运行测试的名字以及其说明文字。 #### 参数化多个变量并记录到Allure报告 当存在多个需要变化的参数时,也可以一起打包成一组来进行参数化处理: ```python import allure import pytest login_data = [ ('admin', '', 'Password cannot be empty'), # 用户名不为空 密码为空 ('', 'password', 'Username cannot be empty'), # 用户名为空 密码不为空 ('invalid_user', 'wrong_password', 'Invalid username or password'), ('valid_user', 'correct_password', None), # 正确用户名密码 登录成功 ] @pytest.mark.parametrize("username,password,message", login_data) def test_login(username, password, message): @allure.title(f'Login Test - Username: "{username}", Password: {"*" * len(password)}') def inner_test(): nonlocal message try: # 假设这里有一个登录函数 login() result = login(username=username, password=password) if not message is None: raise AssertionError(message) except Exception as e: allure.attach(str(e)) raise inner_test() ``` 上述例子中定义了一系列可能遇到的不同情况下的登录尝试及其预期的结果消息;然后针对每一对输入值执行一次测试过程,在失败的情况下会捕获异常并将错误信息附加至Allure报告之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值