在 pytest 测试框架中,参数化测试(Parametrized Testing)意味着将一个测试用例设计为能够接受不同输入数据(参数)并分别执行,以验证被测试代码在面对多种情况时的行为是否符合预期。参数化测试的核心理念是通过复用相同的测试逻辑,但使用不同的输入数据集来增加测试覆盖率,减少代码重复,并提高测试的灵活性和效率。该篇文章就如何使用pytest进行参数化配置来深入解析:
目录
一、参数化测试概念
参数化测试是一种软件测试策略,它允许测试人员或开发人员使用一组预定义的输入数据集合来运行相同的测试逻辑。这意味着一个测试用例可以被设计为接受不同参数,并根据这些参数执行相应的测试操作。这种方法有助于提高测试覆盖率,确保程序在多种数据条件下的行为正确性,同时减少了编写重复测试代码的工作量。
在参数化测试中,测试脚本保持不变,但其执行时使用的数据集可以灵活变化。这些数据集可能包括边界条件、异常情况、典型用户输入、负测试用例等。通过参数化,测试团队可以系统地遍历各种预期和非预期的输入情况,确保软件在面对多种输入时都能稳定、准确地响应。
二、使用 pytest.mark.parametrize
1、基本用法
pytest的参数化主要通过 pytest.mark.parametrize 装饰器实现。这个装饰器允许你为测试函数指定一组或多组不同的输入数据和预期输出(如果有),从而生成多个独立的测试用例。
基本用法如下:
import pytest
# 假设有一个待测试的函数 `add(a, b)`
def add(a, b):
return a + b
# 使用 @pytest.mark.parametrize 装饰器参数化测试函数
@pytest.mark.parametrize("a, b, expected_sum", [
(1, 2, 3),
(0, 5, 5),
(-1, -2, -3),
# ... 更多测试数据
])
def test_add(a, b, expected_sum):
result = add(a, b)
assert result == expected_sum
在这个例子中,pytest.mark.parametrize 接受三个参数:
参数名:一个由逗号分隔的字符串列表,表示要传递给测试函数的参数名。在这个例子中是 "a, b, expected_sum"。
数据集:一个嵌套列表,其中每个内部元组对应一组测试数据。元组中的元素按照参数名的顺序与测试函数的参数对应。例如,元组 (1, 2, 3) 表示 a=1, b=2, expected_sum=3。
当 pytest 运行时,它会为每组数据生成一个单独的测试用例(我们写了三组数据也就是会生成三个单独的测试用例),并调用 test_add 函数,传入相应的参数值。这样,即使测试逻辑相同(即检查 add() 函数的输出是否等于预期和),由于使用了不同的输入数据,实际执行的是多个独立的测试。
通过 ids 关键字参数,可以为生成的测试用例提供易读的名称,尤其是在测试数据难以从参数值直接推断的情况下:
import pytest
#场景一:简