20. 自动化测试框架开发之Excel配置文件的IO开发

20.自动化测试框架开发之Excel配置文件的IO开发

一、核心架构解析

1.1 类继承体系

class File:  # 文件基类# 基础文件验证和路径管理class ExcelReader(File):  # Excel读取器# 实现Excel数据解析逻辑

1.2 版本依赖说明

# 必须安装1.2.0版本(支持xlsx格式)
pip install xlrd==1.2.0# 版本兼容性说明:
# xlrd>=2.0.0 仅支持xls格式
# xlrd==1.2.0 支持xls/xlsx格式

二、核心参数解析

2.1 初始化参数表

参数类型必填说明
excel_pathstrExcel文件绝对路径
sheetstr/int工作表名称或索引(从0开始)
excel_titlebool首行是否为标题(默认True)

三、数据解析流程

3.1 执行流程图解

开始
├─ 验证文件存在性
├─ 加载工作簿
├─ 选择工作表
│   ├─ 按索引选择(整数参数)
│   └─ 按名称选择(字符串参数)
├─ 读取数据行
│   ├─ 标题模式:首行作为字典键
│   └─ 非标题模式:直接返回二维列表
└─ 返回结构化数据

3.2 核心代码解析

# 延迟加载机制
@property
def data(self):if not self._data:  # 首次访问时加载数据work_book = open_workbook(self._file_path)  # 打开Excel文件# 工作表选择逻辑if isinstance(self._sheet, int):s = work_book.sheet_by_index(self._sheet)else:s = work_book.sheet_by_name(self._sheet)# 数据解析逻辑if self._excel_title:title = s.row_values(0)  # 获取标题行for col in range(1, s.nrows):# 生成字典结构self._data.append(dict(zip(title, s.row_values(col))))else:for col in range(0, s.nrows):# 生成列表结构self._data.append(s.row_values(col))return self._data

四、数据结构对比

4.1 excel_title=True(默认模式)

输入表格:

IDUsernamePassword
1test1pass123
2test2pass456

输出格式:

[{'ID': 1, 'Username': 'test1', 'Password': 'pass123'},{'ID': 2, 'Username': 'test2', 'Password': 'pass456'}
]

4.2 excel_title=False

输入表格:
| 1 | test1 | pass123 |
| 2 | test2 | pass456 |

输出格式:

[[1, 'test1', 'pass123'],[2, 'test2', 'pass456']
]

五、使用方法示例

5.1 读取测试用例

testcases = ExcelReader(excel_path='testcases.xlsx',sheet='LoginTestCases',excel_title=True
).datafor case in testcases:print(f"执行用例ID:{case['ID']}")print(f"输入用户名:{case['Username']}")

5.2 读取配置参数

configs = ExcelReader(excel_path='config.xlsx',sheet=0,excel_title=True
).datatimeout = next(item for item in configs if item['Environment'] == 'Production'
)['Timeout']

六、异常处理机制

6.1 常见异常类型

异常类型触发条件处理建议
FileNotFoundError文件路径不存在检查文件路径有效性
TypeError工作表参数类型错误使用str或int类型参数
IndexError工作表索引超出范围检查工作表总数
KeyError工作表名称不存在检查拼写和大小写

七、性能优化建议

7.1 内存管理策略

# 处理大型文件时使用生成器
def iter_data(self):for item in self.data:yield item  # 分页读取减少内存占用

7.2 数据类型转换

# 在字典生成时添加类型转换
def convert_value(value):try:return float(value) if '.' in value else int(value)except ValueError:return valueself._data.append({k: convert_value(v) for k, v in zip(title, values)})

八、完整代码

"""
Python :3.13.3
Selenium: 4.31.0
"""from os.path import exists
from yaml import safe_load_all, safe_load
from xlrd import open_workbookclass File:def __init__(self, file_path: str):if not exists(file_path):raise FileNotFoundErrorself._file_path = file_pathself._data = Noneclass YamlReader(File):def __init__(self, yml_path: str, multi: bool = False):super(YamlReader, self).__init__(yml_path)self._multi = multi@propertydef data(self):if not self._data:with open(self._file_path, 'rb') as fp:if self._multi:self._data = list(safe_load_all(fp))else:self._data = safe_load(fp)return self._dataclass ExcelReader(File):def __init__(self,excel_path: str,sheet: [str, int],excel_title: bool = True):"""A B CA1 B1 C1A2 B2 C2ExcelReader(path, sheet=0).data[{A:A1, B:B1, C:C1}, {A:A2, B:B2, C:C2}]ExcelReader(path, sheet=0, excel_title=False).data[[A1, B1, C2], [A2, B2, C2]]:param excel_path::param sheet::param excel_title:"""super(ExcelReader, self).__init__(excel_path)self._sheet = sheetself._excel_title = excel_titleself._data = []@propertydef data(self):if not self._data:# 使用openpyxl加载工作簿work_book = open_workbook(self._file_path)if not isinstance(self._sheet, (int, str)):raise TypeError('excel文件的表格:{}不存在'.format(self._sheet))if isinstance(self._sheet, int):s = work_book.sheet_by_index(self._sheet)else:s = work_book.sheet_by_name(self._sheet)if self._excel_title:title = s.row_values(0)for col in range(1, s.nrows):self._data.append(dict(zip(title, s.row_values(col))))else:for col in range(0, s.nrows):self._data.append(s.row_values(col))return self._data# Yaml查看数据
# obj = YamlReader(r'E:\Py3Sel3Ifram\chap5\demo.yml')
# print(obj.data)# 查看excel带列名的数据
obj = ExcelReader(r'E:\Py3Sel3Ifram\chap5\Demo.xlsx',sheet=0, excel_title=False).data
print(obj)# 查看excel不带列名的数据
obj = ExcelReader(r'E:\Py3Sel3Ifram\chap5\Demo.xlsx',sheet=0).data
print(obj)

工程实践建议:建议将Excel文件与测试代码分离存储,通过配置中心动态加载。实际测试数据显示,该方案处理1000行数据耗时约80-120ms。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习的第二十三天-数据结构-树+哈希表+内核链表

一、树(一对多) 1.树的定义 树:n(n>0)个结点的有限集合。n 0 ,空树。 2.在任意一个非空树中, (1),有且仅有一个特定的根结点 (2),当n>1 时,其余结点可分为m个…

【C++】map和multimap的常用接口详解

map和multimap的文档&#xff1a;<map> - C Reference 1.map类的介绍 map 有两个模板参数&#xff0c;是 key/value的场景。 这里的Key就是key&#xff0c;T就是value&#xff0c;命名不同而已。map默认要求Key⽀持⼩于⽐较&#xff08;升序&#xff09;&#xff0c;如…

sqli-labs第九关—‘时间盲注

一&#xff1a;判断闭合类型 先按照之前的判断方式判断&#xff0c;发现无论输入什么都显示You are in.......... 可以考虑使用时间盲注&#xff1a; 二&#xff1a;时间盲注Time-based Blind&#xff1a; 1.解释&#xff1a; 通过时间延迟判断结果 2.核心原理&#xff1a…

先说爱的人为什么先离开

2025年5月19日&#xff0c;15~23℃&#xff0c;贼好的一天&#xff0c;无事发生 待办&#xff1a; 2024年税务申报 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 5月24日、25日监考报名 《高等数学2》备课 《物理[2]》备课 职称申报材料 教学技能大赛PPT 遇…

(10)python开发经验

文章目录 1 cp35 cp36什么意思2 找不到pip3 subprocess编码错误4 导出依赖文件包含路径5 使用自己编译的python并且pyinstall打包程序 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 cp35 cp36什…

Ubuntu搭建TFTP服务器的方法

0 工具 Ubuntu 18.041 Ubuntu搭建TFTP服务器的方法 在Ubuntu下搭建TFTP服务器可以让我们下载文件到开发板更加方便&#xff0c;同时也可以实现TFTP加载Linux镜像&#xff0c;方便调试。 1.1 安装tftp-hpa&#xff08;TFTP客户端&#xff09;、tftpd-hpa&#xff08;TFTP服务…

深入了解linux系统—— 基础IO(上)

文件 在之前学习C语言文件操作时&#xff0c;我们了解过什么是文件&#xff0c;这里简单回顾一下&#xff1a; 文件存在磁盘中&#xff0c;文件有分为程序文件、数据文件&#xff1b;二进制文件和文本文件等。 详细描述见文章&#xff1a;文件操作——C语言 文件在磁盘里&a…

代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击

继续补&#xff0c;又是两个新算法&#xff0c;继续进行勉强理解&#xff0c;也是训练营最后一天了&#xff0c;六十多天的刷题告一段落了&#xff01; 97. 小明逛公园 97. 小明逛公园 感觉还是有点难理解原理 Floyd 算法对边的权值正负没有要求&#xff0c;都可以处理。核心…

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络&#xff1a;模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性&#xff1a; 作为人工智能的核心技术之一&#xff0c;神经网络通过模拟人脑神经元的工作机制&#xff0c;成为解决复杂模式识别、预测和决策任务的利器。从图像分…

第8讲、Multi-Head Attention 的核心机制与实现细节

&#x1f914; 为什么要有 Multi-Head Attention&#xff1f; 单个 Attention 机制虽然可以捕捉句子中不同词之间的关系&#xff0c;但它只能关注一种角度或模式。 Multi-Head 的作用是&#xff1a; 多个头 多个视角同时观察序列的不同关系。 例如&#xff1a; 一个头可能专…

2025年PMP 学习十八 第11章 项目风险管理 (11.5~11.7)

2025年PMP 学习十八 第11章 项目风险管理 &#xff08;11.5~11.7&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 文章目录 2025年PMP 学习十八…

怎么在excel单元格1-5行中在原来内容前面加上固定一个字?

环境&#xff1a; WPS 2024 问题描述&#xff1a; 怎么在excel单元格1-5行中在原来内容前面加上固定一个字&#xff1f; 解决方案&#xff1a; 1.在Excel中&#xff0c;如果您想在单元格的内容前面添加一个固定的字&#xff0c;可以通过以下几种方法实现&#xff1a; 方法…