利用parametrize()函数进行测试数据的批量处理
参数化测试是一种常见的测试技术,它可以用来对同一个测试用例使用不同的输入数据进行测试,从而提高测试覆盖率和效率。在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()函数根据需要创建不同的参数列表,从而更好地验证被测试的功能。
