pytest—pytest.mark.parametrize的使用

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

一、前言

我们这篇文章呢来讲讲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"

运行结果如下:

 

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

 

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

### 参数化测试的基本用法 `@pytest.mark.parametrize` 是 `pytest` 提供的一个装饰器,用于实现参数化测试。通过该装饰器,可以为测试函数提供多组参数,并依次运行每组参数下的测试逻辑。这种机制非常适合验证函数在不同输入下的行为是否正确。 #### 基本语法 装饰器的语法如下: ```python @pytest.mark.parametrize("参数名", 数据集) ``` 其中,`参数名` 是测试函数中的参数名,`数据集` 是一个可迭代对象(如列表、元组等),其中的每个元素都是一组参数值。 #### 单参数测试 下面是一个简单的单参数测试示例: ```python import pytest @pytest.mark.parametrize("name", ["John", "Alice"]) def test_function(name): assert name != "" ``` 在上述代码中,`test_function` 会运行两次,分别传入 `"John"` 和 `"Alice"` 作为 `name` 参数的值 [^4]。 #### 多参数测试 如果需要测试多个参数的组合,可以将多个参数名用逗号分隔,并提供对应的参数值列表。例如: ```python import pytest @pytest.mark.parametrize("name, age", [["张杰", 10], ["胡歌", 11], ["娜扎", 12]]) def test_api2(name, age): print(name, age) assert name != "" assert age > 0 ``` 在此示例中,`test_api2` 会运行三次,分别传入 `["张杰", 10]`、`["胡歌", 11]` 和 `["娜扎", 12]` 作为 `name` 和 `age` 的值 [^4]。 #### 多重参数化装饰器 还可以多次使用 `@pytest.mark.parametrize` 来实现传递不同的参数。这种情况下,测试函数会运行所有参数组合的笛卡尔积结果。例如: ```python import pytest @pytest.mark.parametrize("name", ["John", "Alice"]) @pytest.mark.parametrize("age", [25, 30]) def test_function(name, age): assert name != "" assert age > 0 ``` 在上述代码中,`test_function` 会运行 4 次(`name` 有 2 个值,`age` 有 2 个值,共 2x2 = 4 种组合) [^2]。 ### 自定义装饰器与参数化装饰器结合使用 除了直接使用 `@pytest.mark.parametrize`,还可以将其与自定义装饰器结合使用。自定义装饰器可以封装一些通用的逻辑,例如日志记录、性能监控等,然后与参数化功能结合使用以增强测试能力。 例如,定义一个简单的自定义装饰器: ```python def custom_decorator(func): def wrapper(*args, **kwargs): print("Before test execution") result = func(*args, **kwargs) print("After test execution") return result return wrapper ``` 然后将其与 `@pytest.mark.parametrize` 结合使用: ```python import pytest def custom_decorator(func): def wrapper(*args, **kwargs): print("Before test execution") result = func(*args, **kwargs) print("After test execution") return result return wrapper @pytest.mark.parametrize("name", ["John", "Alice"]) @custom_decorator def test_function(name): assert name != "" ``` 在此示例中,`test_function` 会运行两次,并且每次运行前后都会打印相应的信息 [^1]。 ### 配置文件与参数化测试 `pytest` 还支持通过 `pytest.ini` 配置文件来定义全局设置,以优化测试执行。例如,可以通过配置文件指定默认的命令行参数、测试路径等。以下是一个简单的 `pytest.ini` 配置示例: ```ini [pytest] addopts = -v -s --html=py_test/scripts/report/report.html -p no:warnings --reruns=10 testpaths = ./py_test/scripts python_files = test_rerun.py python_classes = Test* python_function = test* xfail_strict = true ``` 该配置文件指定了输出详细信息、生成 HTML 报告、忽略警告信息、测试路径等设置 [^3]。 ### 总结 `@pytest.mark.parametrize` 是一个非常强大的工具,能够显著提升测试覆盖率和代码复用率。通过合理的参数化设计,可以轻松实现对多种输入组合的自动化测试。此外,结合自定义装饰器和配置文件,可以进一步扩展测试功能,提高测试效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值