企业级自动化测试框架的核心用 Excel 管理测试数据是很多团队的标配它平衡了非技术人员可编辑性和技术实现的便捷性。当前主流的 Excel 测试数据管理方案。用 Excel 管理 Allure 测试数据是企业级自动化测试框架的核心能力。这种方案完美平衡了非技术人员可维护性和技术实现的便捷性是数据驱动测试的经典实现。核心架构设计技术选型# 依赖库 pip install openpyxl pytest allure-pytest pandas requestsExcel 文件结构设计test_cases.xlsx ├── 登录模块 ├── 订单管理 └── 支付系统完整实现方案1. Excel 数据文件模板创建test_data.xlsx文件包含以下关键字段用例ID一级模块二级模块用例标题测试数据预期结果优先级TC001用户管理登录认证管理员登录成功{username:admin}{code:200}criticalTC002用户管理登录认证错误密码登录{username:admin,pwd:wrong}{code:401}normal2. Excel 数据读取工具类# utils/excel_reader.py import openpyxl from typing import List, Dict from pathlib import Path class ExcelReader: staticmethod def get_excel_path(filename: str test_data.xlsx) - str: 获取 Excel 文件的绝对路径 project_root Path(__file__).parent.parent return str(project_root / test_data / filename) staticmethod def read_test_cases(sheet_name: str None) - List[Dict]: 读取 Excel 测试数据 :param sheet_name: 工作表名称默认读取第一个工作表 :return: 测试用例列表 excel_path ExcelReader.get_excel_path() workbook openpyxl.load_workbook(excel_path) # 选择工作表 sheet workbook[sheet_name] if sheet_name else workbook.active # 读取表头 headers [cell.value for cell in sheet[1]] # 读取数据行 test_cases [] for row in sheet.iter_rows(min_row2, values_onlyTrue): if row[0]: # 跳过空行 test_case dict(zip(headers, row)) # 处理 JSON 字符串字段 for field in [测试数据, 预期结果]: if field in test_case and isinstance(test_case[field], str): try: import json test_case[field] json.loads(test_case[field]) except: pass test_cases.append(test_case) workbook.close() return test_cases # 测试验证 if __name__ __main__: cases ExcelReader.read_test_cases(登录模块) print(f读取到 {len(cases)} 条测试用例) for i, case in enumerate(cases, 1): print(f{i}. {case[用例标题]})3. Pytest 测试用例集成# tests/test_login.py import pytest import allure import json from utils.excel_reader import ExcelReader # 读取测试数据 TEST_DATA ExcelReader.read_test_cases(登录模块) allure.epic(电商平台) allure.feature(用户管理模块) class TestLogin: pytest.mark.parametrize(base_info, TEST_DATA) def test_login(self, base_info): 登录功能测试 数据驱动从 Excel 读取测试用例 # 核心动态配置 Allure 报告 # 记录完整测试用例信息 allure.dynamic.parameter( caseinfo, json.dumps(base_info, ensure_asciiFalse, indent2) ) # 动态设置功能模块层级 allure.dynamic.feature(base_info.get(一级模块, 默认模块)) allure.dynamic.story(base_info.get(二级模块, 默认模块)) # 动态设置用例标题 allure.dynamic.title(base_info.get(用例标题, 默认用例标题)) # 动态设置优先级 severity base_info.get(优先级, normal) severity_map { critical: allure.severity_level.CRITICAL, major: allure.severity_level.MAJOR, normal: allure.severity_level.NORMAL, minor: allure.severity_level.MINOR } allure.dynamic.severity(severity_map.get(severity, allure.severity_level.NORMAL)) # 测试执行逻辑 with allure.step(准备测试数据): test_data base_info.get(测试数据, {}) expected_result base_info.get(预期结果, {}) # 记录请求数据到报告 allure.attach( json.dumps(test_data, ensure_asciiFalse), 请求数据, allure.attachment_type.JSON ) with allure.step(执行登录操作): # 模拟接口请求 response mock_api_request(test_data) # 记录响应数据到报告 allure.attach( json.dumps(response, ensure_asciiFalse), 响应数据, allure.attachment_type.JSON ) with allure.step(验证结果): # 断言 assert response[code] expected_result.get(code), \ f状态码不匹配: 预期 {expected_result.get(code)}, 实际 {response[code]} def mock_api_request(data): 模拟接口请求实际项目中替换为真实接口 username data.get(username, ) password data.get(pwd, 123456) if username admin and password 123456: return {code: 200, message: 登录成功, token: abc123} elif password wrong: return {code: 401, message: 密码错误} else: return {code: 400, message: 参数错误}4. 项目配置文件# pytest.ini [pytest] addopts --alluredir./allure-results --clean-alluredir -v -s testpaths tests python_files test_*.py python_classes Test* python_functions test_*# conftest.py import pytest import allure pytest.fixture(scopesession, autouseTrue) def setup_test_environment(): 测试环境初始化 # 设置环境信息 allure.environment( osWindows, python_version3.9, test_environmentstaging ) yield # 清理操作执行和报告生成运行测试# 执行测试 pytest tests/test_login.py # 指定工作表运行 pytest tests/test_login.py --sheet登录模块 # 生成报告 allure generate ./allure-results -o ./allure-report --clean allure open ./allure-report高级功能扩展1. 动态链接集成# 在测试用例中动态添加链接 allure.dynamic.link( fhttps://jira.example.com/{base_info.get(缺陷编号, )}, name关联缺陷, link_typeallure.link_type.ISSUE ) allure.dynamic.link( fhttps://wiki.example.com/api/{base_info.get(API文档, )}, nameAPI文档, link_typeallure.link_type.LINK )2. 多工作表支持# tests/conftest.py def pytest_generate_tests(metafunc): 动态生成测试用例 if base_info in metafunc.fixturenames: # 读取所有工作表 workbook openpyxl.load_workbook(test_data/test_data.xlsx) test_cases [] for sheet_name in workbook.sheetnames: cases ExcelReader.read_test_cases(sheet_name) test_cases.extend(cases) # 参数化 metafunc.parametrize(base_info, test_cases)3. 数据验证增强# utils/data_validator.py class DataValidator: staticmethod def validate_test_case(case: Dict) - bool: 验证测试用例数据完整性 required_fields [用例ID, 一级模块, 用例标题] return all(field in case for field in required_fields) staticmethod def sanitize_data(data: Dict) - Dict: 数据清洗和规范化 # 去除空格 return {k: (v.strip() if isinstance(v, str) else v) for k, v in data.items()}实战优势分析1.维护效率提升非技术人员直接在 Excel 中修改用例无需改动代码即可新增/修改测试场景数据与逻辑完全分离2.协作便捷性# 多人协作场景 # 开发者维护测试框架和接口封装 # 测试人员在 Excel 中维护测试数据和预期结果 # 产品经理可以审查 Excel 中的测试覆盖度3.可扩展性强# 支持多种数据源 class DataFactory: staticmethod def get_data(source_type, **kwargs): if source_type excel: return ExcelReader.read_test_cases(** kwargs) elif source_type database: return DatabaseReader.read_test_cases(**kwargs) elif source_type csv: return CSVReader.read_test_cases(** kwargs)4.报告可视化增强Allure 报告会自动展示完整的测试层级结构Epic/Feature/Story详细的参数信息完整的测试数据 JSON智能的测试标题根据业务场景动态生成关联的文档链接和缺陷追踪常见问题解决1. Excel 数据格式问题# 确保单元格格式正确 # JSON 字段使用文本格式避免 Excel 自动转换2. 中文编码问题# 读取时指定编码 import openpyxl workbook openpyxl.load_workbook(filename, data_onlyTrue)3. 性能优化# 大量数据时的优化 def read_test_cases_optimized(sheet_name: str) - List[Dict]: 优化读取性能支持大量数据 # 使用生成器模式 for row in sheet.iter_rows(min_row2, values_onlyTrue): yield dict(zip(headers, row))这个 Excel Allure Pytest 的组合是企业级自动化测试框架的标配方案它将数据管理的简便性和技术实现的强大性完美结合能够显著提升测试效率和维护性。