1. 为什么需要参数化测试
在自动化测试领域,重复编写相似的测试用例是常见但低效的做法。假设我们需要测试一个计算器程序的加法功能,传统方式可能会这样写:
python复制def test_addition_case1():
assert add(1, 2) == 3
def test_addition_case2():
assert add(0, 0) == 0
def test_addition_case3():
assert add(-1, 1) == 0
这种写法存在三个明显问题:首先是代码重复,每个测试用例只有输入输出值不同;其次是维护成本高,当测试逻辑变化时需要修改多个地方;最后是缺乏统一管理,测试数据分散在各个用例中。
参数化测试通过将测试数据与测试逻辑分离来解决这些问题。Pytest的参数化功能允许我们定义一个测试函数,然后为其提供多组输入输出数据,框架会自动生成多个测试用例。这不仅减少了代码量,还使测试数据更易于管理和维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Pytest参数化基础用法
2.1 @pytest.mark.parametrize装饰器
Pytest通过@pytest.mark.parametrize装饰器实现参数化。其基本语法如下:
python复制@pytest.mark.parametrize("arg1, arg2, expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0)
])
def test_addition(arg1, arg2, expected):
assert add(arg1, arg2) == expected
这个装饰器接收两个主要参数:
- 参数名字符串:用逗号分隔的参数名,对应测试函数的参数
- 参数值列表:由元组组成的列表,每个元组代表一组参数值
当运行这个测试时,Pytest会生成三个独立的测试用例,分别对应三组参数。测试报告会清楚地显示每组参数的执行情况。
2.2 参数化测试命名
默认情况下,Pytest会为参数化测试生成类似test_addition[1-2-3]这样的名称。我们可以通过ids参数自定义测试名称:
python复制@pyt
