欢迎访问宙启技术站
智能推送

利用parametrize()函数进行测试数据的批量处理

发布时间:2023-12-23 17:46:26

参数化测试是一种常见的测试技术,它可以用来对同一个测试用例使用不同的输入数据进行测试,从而提高测试覆盖率和效率。在Python中,pytest框架提供了parametrize()函数,可以方便地进行参数化测试。

parametrize()函数需要两个参数, 个参数是参数化的参数名称,可以是一个字符串或者是一个用逗号分隔的字符串列表。第二个参数是一个参数化的值的列表,可以是一个列表、一个元组或者一个生成器。

下面是一个使用parametrize()函数进行参数化测试的例子:

import pytest

def add(a, b):
    return a + b

# 定义参数化测试用例
@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),          # 测试用例1,期望结果是3
    (-1, -2, -3),       # 测试用例2,期望结果是-3
    (0, 0, 0)           # 测试用例3,期望结果是0
])
def test_add(a, b, expected):
    assert add(a, b) == expected

在上面的例子中,定义了一个add()函数用来进行两个数的相加运算。然后使用parametrize()函数对test_add()函数进行参数化测试,定义了三个测试用例,每个测试用例包含两个输入参数a和b,以及一个期望结果expected。parametrize()函数的参数名称和参数值列表使用了 pytest 的标准的参数化方式。

使用pytest命令运行测试脚本时,会自动运行包含@parametrize装饰器的测试函数。在测试过程中,pytest会自动按照参数化的方式多次运行test_add()函数,每次运行时使用不同的参数值。

运行上面的测试脚本,输出结果如下:

============================= test session starts =============================
...
collected 3 items

test_parametrize.py::test_add[1-2-3] PASSED                               [ 33%]
test_parametrize.py::test_add[-1--2--3] PASSED                            [ 66%]
test_parametrize.py::test_add[0-0-0] PASSED                               [100%]

============================= 3 passed in 0.01 seconds ==============================

可以看到,使用parametrize()函数进行参数化测试后,测试用例会自动根据不同的参数值进行多次运行,从而覆盖多种情况下的测试。

除了直接在装饰器中指定参数化的值列表之外,还可以使用生成器来动态生成参数值列表。这样可以灵活地根据需要生成不同的参数列表。

下面是一个使用生成器进行动态参数化的例子:

import pytest

def fib(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    else:
        result = [0, 1]
        a, b = 0, 1
        for i in range(2, n):
            a, b = b, a + b
            result.append(b)
        return result

# 定义参数化测试用例
@pytest.mark.parametrize("n, expected", (
    (0, []),
    (1, [0]),
    (2, [0, 1]),
    (5, [0, 1, 1, 2, 3]),
    (10, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
))
def test_fib(n, expected):
    assert fib(n) == expected

在上面的例子中,定义了一个fib()函数用来生成斐波那契数列。使用parametrize()函数对test_fib()函数进行参数化测试,定义了多个测试用例,每个测试用例包含一个输入参数n和一个期望结果expected。使用生成器动态生成了参数值列表。

运行上面的测试脚本,输出结果如下:

============================= test session starts =============================
...
collected 5 items

test_parametrize.py::test_fib[0-[]] PASSED                                [ 20%]
test_parametrize.py::test_fib[1-[0]] PASSED                              [ 40%]
test_parametrize.py::test_fib[2-[0, 1]] PASSED                           [ 60%]
test_parametrize.py::test_fib[5-[0, 1, 1, 2, 3]] PASSED                  [ 80%]
test_parametrize.py::test_fib[10-[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]] PASSED [100%]

============================= 5 passed in 0.01 seconds ==============================

可以看到,使用生成器动态生成参数值列表后,测试用例也会自动根据不同的参数值进行多次运行。

总结来说,parametrize()函数可以方便地进行参数化测试,并且可以灵活地使用不同的测试数据进行批量处理,从而提高测试覆盖率和效率。在编写测试用例时,可以使用parametrize()函数根据需要创建不同的参数列表,从而更好地验证被测试的功能。