12:参数化测试,一套用例批量跑 N 组数据

发布时间:2026/5/26 14:49:51

12:参数化测试,一套用例批量跑 N 组数据 在自动化测试尤其是 GUI、接口自动化中我们经常遇到同一个业务逻辑需要用多组不同的输入数据来验证的场景。比如登录功能正确账号 正确密码、错误账号 正确密码、正确账号 错误密码…… 如果每组数据都写一个测试用例代码会大量冗余维护成本极高。pytest 内置的参数化功能就是解决这个问题的 “神器”。它能让一个测试函数自动循环执行多组数据代码极简、扩展性极强是自动化测试框架必备技能。一、什么是参数化为什么要用它1. 概念参数化设计是自动化测试中的重要组成部分它通过定义测试参数和预期结果让同一个测试用例自动运行多组不同数据实现 “一套用例批量测试” 的效果让测试过程更灵活、更可控。2. 核心优势代码复用不用重复写相似的测试函数一组逻辑跑所有数据易维护新增 / 删除测试数据只改参数列表不用动测试逻辑覆盖率高轻松覆盖正常、异常、边界等所有测试场景报告清晰pytest 会自动给每组数据生成独立的测试结果。二、pytest 参数化核心pytest.mark.parametrizepytest 通过内置装饰器pytest.mark.parametrize实现参数化是最常用、最灵活的方式。基本语法pytest.mark.parametrize(参数名1,参数名2, [ (数据1_1, 预期1), (数据2_1, 预期2), (数据3_1, 预期3), ]) def test_func(参数名1, 参数名2): # 测试逻辑 assert ...三、3种常用参数化用法含你的示例详解示例 1测试函数上使用参数化最常用直接给单个测试函数添加参数适合独立的测试场景。import pytest # 定义输入参数 预期结果 pytest.mark.parametrize(test_input, expected, [ (35, 8), # 用例1 (24, 6), # 用例2 (6*9, 54), # 用例3 ]) def test_eval(test_input, expected): # 执行测试逻辑 assert eval(test_input) expected执行效果 测试函数会自动运行 3 次每次传入一组数据分别断言。 任意一组数据失败不影响其他组执行报告中会单独标记失败。示例 2测试类上使用参数化给整个类加参数化类中所有测试方法都会自动使用这些数据。import pytest # 给类统一传参 pytest.mark.parametrize(n, expected, [(1, 2), (3, 4)]) class TestClass: # 两个方法都会自动接收 n 和 expected def test_simple_case(self, n, expected): assert n 1 expected def test_weird_simple_case(self, n, expected): assert (n * 1) 1 expected适用场景 类中所有测试方法都需要使用相同的多组数据时使用。示例 3模块级参数化整个文件生效给整个测试模块设置参数文件中所有测试类、测试函数都会自动使用这些参数。方式定义全局变量pytestmark名字不能修改import pytest # 全局参数化整个文件生效 pytestmark pytest.mark.parametrize(n, expected, [(1, 2), (3, 4)]) class TestClass01: def test_simple_case(self, n, expected): assert n 1 expected class TestClass02: def test_weird_simple_case(self, n, expected): assert (n * 1) 1 expected适用场景 整个测试文件的用例都依赖同一组参数。四、高级用法自定义外部数据源动态传参除了直接写参数列表还可以从函数、Excel、YAML、JSON 读取测试数据实现数据与代码分离。示例 3函数作为参数数据源# 自定义数据源函数 def data_provider(): return [(admin, 123456), (test, 123456), (guest, 123456)] # 直接引用函数 pytest.mark.parametrize(username, password, data_provider()) def test_login(username, password): print(f登录{username}) assert username ! 优势 数据源可以独立维护支持从文件 / 数据库读取适合企业级自动化项目。五、GUI 自动化实战登录参数化最经典场景可直接套用的实战示例import pytest from selenium import webdriver from selenium.webdriver.common.by import By # 测试数据用户名、密码、预期结果 pytest.mark.parametrize(username, pwd, expect_text, [ (correct_user, correct_pwd, 登录成功), (wrong_user, correct_pwd, 用户名或密码错误), (correct_user, wrong_pwd, 用户名或密码错误), (, , 用户名不能为空), ]) def test_gui_login(username, pwd, expect_text): driver webdriver.Chrome() driver.get(http://demo.com/login) # GUI 操作 driver.find_element(By.ID, username).send_keys(username) driver.find_element(By.ID, password).send_keys(pwd) driver.find_element(By.ID, loginBtn).click() # 获取提示文本并断言 tip_text driver.find_element(By.ID, tip).text assert expect_text in tip_text driver.quit()效果 一个用例自动测4 组登录场景完美覆盖正常、异常、空值。六、参数化高级小技巧提升可读性1. 给每组数据加用例名称ids 参数ids 是 pytest.mark.parametrize 的可选参数作用是给每一组测试用例起一个自定义的、易读的名字方便你在运行测试、查看报告时快速识别每个用例是测什么的。pytest.mark.parametrize(username, pwd, expect, [ (admin, 123, 成功), (test, xxx, 失败), ], ids[正确账号登录, 错误密码登录]) def test_login(...): ...不加ids时 测试用例名会自动生成可读性很差test_login[admin-123-成功] test_login[test-xxx-失败]加了ids后 用例名变成你定义的中文 / 英文描述一目了然test_login[正确账号登录] test_login[错误密码登录]2. 多个参数化装饰器叠加笛卡尔积生成所有组合适合全面覆盖pytest.mark.parametrize(a, [1,2]) pytest.mark.parametrize(b, [3,4]) def test_add(a, b): # 会执行 (1,3) (1,4) (2,3) (2,4) assert a b 0七、总结pytest 参数化是自动化测试最核心、最实用的功能之一它解决了 “多组数据重复写用例” 的问题。你必须掌握的 3 种用法函数参数化单个用例使用多组数据类参数化类中所有用例共享数据模块参数化整个文件所有用例统一传参。额外加分技能自定义数据源函数GUI 自动化登录 / 表单批量测试学会参数化你的自动化用例开发效率至少提升3~5 倍

相关新闻