Pytest之mark.parametrize详解

pytest.mark.parametrizepytest 框架中一个非常强大的功能,用于对测试函数进行参数化。通过参数化,可以用不同的输入数据多次运行同一个测试函数,从而减少代码重复并提高测试覆盖率。

1. 基本用法

pytest.mark.parametrize 的基本语法如下:

import pytest

@pytest.mark.parametrize("input, expected", [
    (1, 2),
    (2, 4),
    (3, 6),
])
def test_multiply_by_two(input, expected):
    assert input * 2 == expected

在这个例子中,test_multiply_by_two 测试函数会被运行三次,每次使用不同的 inputexpected 值。

2. 参数详解

  • 第一个参数:一个字符串,表示测试函数的参数名称,多个参数用逗号分隔。
  • 第二个参数:一个可迭代对象(通常是列表或元组),包含多组参数值。每组参数值可以是元组、列表或字典。

3. 多参数参数化

你可以同时参数化多个参数:

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (4, 5, 9),
    (10, 
### pytest parametrize 参数化用法详解 `pytest` 是 Python 中非常流行的单元测试框架,其 `parametrize` 功能可以方便地实现参数化测试。通过该功能,可以在单个测试函数中运行多组输入数据并验证预期结果。 #### 基本语法 `@pytest.mark.parametrize` 装饰器用于指定一组或多组参数及其对应的期望值。以下是基本的语法结构: ```python import pytest @pytest.mark.parametrize("input1, input2, expected", [ (case1_input1, case1_input2, case1_expected), (case2_input1, case2_input2, case2_expected), ]) def test_function(input1, input2, expected): result = some_function(input1, input2) assert result == expected ``` 上述代码表示对于每一对 `(input1, input2)` 和 `expected` 的组合,都会执行一次 `test_function` 测试函数[^2]。 --- #### 示例:加法运算的参数化测试 假设我们有一个简单的加法函数 `add(a, b)`,可以通过 `parametrize` 对不同输入进行测试: ```python import pytest def add(a, b): return a + b data = [(1, 2, 3), (-1, -1, -2), (0, 0, 0)] @pytest.mark.parametrize("a,b,expected", data) def test_add(a, b, expected): result = add(a, b) assert result == expected ``` 在这个例子中,`data` 列表包含了三组测试数据,分别对应三种情况下的输入和期望输出。每次调用 `test_add` 函数时,都会传入一个新的参数组合。 --- #### 多重参数化 如果需要对多个参数进行独立的参数化,则可以叠加多个 `@pytest.mark.parametrize` 装饰器。此时,测试案例的数量将是各参数集合大小的 **笛卡尔积**。 ```python import pytest data1 = [1, 2] data2 = ["a", "b", "c"] @pytest.mark.parametrize("num", data1) @pytest.mark.parametrize("char", data2) def test_cartesian_product(num, char): print(f"\n测试数据:{num}-{char}") ``` 在此示例中,`data1` 包含两个数值 `[1, 2]`,而 `data2` 包含三个字符 `["a", "b", "c"]`。因此总共会产生 \(2 \times 3 = 6\) 条测试用例[^4]。 --- #### 使用 fixtures 结合参数化 除了普通的变量外,还可以将 `fixtures` 与 `parametrize` 配合使用。这使得复杂场景中的依赖注入更加灵活。 ```python import pytest @pytest.fixture(params=[1, 2, 3]) def fixture_data(request): return request.param @pytest.mark.parametrize("multiplier", [10, 100]) def test_fixture_with_param(fixture_data, multiplier): result = fixture_data * multiplier print(f"\nfixture 数据: {fixture_data}, 倍数: {multiplier} -> 结果: {result}") ``` 此代码片段展示了如何结合 `request.param` 提供的数据以及外部参数化来构建更复杂的测试逻辑[^5]。 --- #### 注意事项 - 如果某些情况下不需要特定的参数组合,可通过条件跳过部分测试: ```python import pytest @pytest.mark.parametrize("value", [-1, 0, 1]) def test_positive(value): if value < 0: pytest.skip("负数不适用") assert value >= 0 ``` - 当涉及大量数据集时,建议将测试数据存储到外部文件(如 JSON 或 CSV),并通过读取方式加载至脚本中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fro.Heart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值