21. 自动化测试框架开发之Excel配置文件的测试用例改造
21. 自动化测试框架开发之Excel配置文件的测试用例改造
一、测试框架核心架构
1.1 组件依赖关系
# 核心库依赖
import unittest # 单元测试框架
import paramunittest # 参数化测试扩展
from chap3.po import * # 页面对象模型
from file_reader import ExcelReader # Excel数据读取器# 必须使用的库版本
# xlrd==1.2.0(支持xlsx格式)
二、Excel数据驱动实现
2.1 数据加载配置
# Excel数据结构示例
# | name | password | assertion | message |
# |--------|----------|------------------------|-----------------------|
# | Tester | test | Invalid Login or Password | test_login_admin passed |data = ExcelReader(r'E:\Py3Sel3Ifram\chap5\Demo.xlsx',sheet=0, # 第一个工作表excel_title=True # 首行为标题
).data
参数说明:
- sheet=0:读取第一个工作表
- excel_title=True:将首行作为字典键
- 文件路径需使用原始字符串(r前缀)
三、测试用例参数化方案
3.1 使用paramunittest实现(注释方案)
@paramunittest.parametrized(data[1],data[2],data[3])
class TestOder(unittest.TestCase, Oder):def setParameters(self, name, pwd, ass, txt):"""参数映射方法"""self.name = nameself.pwd = pwdself.ass = assself.txt = txtdef test_login(self):"""测试执行方法"""self.get()self.login(self.name, self.pwd)sleep(2)assert self.element('op.invalid_login').text == self.assprint(self.txt)
方案特点:
- 每个测试用例独立执行
- 需要明确指定数据索引
- 自动生成多个测试方法
3.2 使用subTest实现(当前方案)
class TestLogin(unittest.TestCase, Oder):def test_login(self):for d in data:with self.subTest(d): # 子测试上下文self.get()self.login(d['name'], d['password'])sleep(2)try:self.assertEqual(self.element('op.invalid_login').text,d['assertion'])except AssertionError:self.driver.save_screenshot(f'./{d["assertion"]}.png')raiseprint(d['message'])
方案优势:
- 单测试方法管理多组数据
- 失败时继续执行后续用例
- 自动生成详细测试报告
四、关键技术点解析
4.1 数据驱动流程
开始
├─ 读取Excel测试数据
├─ 遍历数据集合
│ ├─ 初始化浏览器
│ ├─ 执行登录操作
│ ├─ 验证断言结果
│ ├─ 成功:输出日志
│ └─ 失败:截图保存
└─ 生成测试报告
4.2 异常处理机制
try:self.assertEqual(actual, expected)
except AssertionError:self.driver.save_screenshot(f'./{d["assertion"]}.png') # 失败截图raise # 重新抛出异常
功能特点:
- 精确捕获断言失败
- 自动保存错误现场
- 保留原始异常堆栈
五、Excel数据规范要求
5.1 数据结构标准
列名 | 类型 | 说明 |
---|---|---|
name | str | 用户名输入 |
password | str | 密码输入 |
assertion | str | 预期断言文本 |
message | str | 测试结果描述 |
5.2 格式注意事项
- 第一行必须为标题行
- 各列顺序需与代码参数对应
- 文本型断言值需完全匹配
- 避免使用特殊字符作为文件名
六、工程实践建议
6.1 数据管理策略
# 建议文件结构
testdata/
├─ login/
│ ├─ valid_login.xlsx
│ └─ invalid_login.xlsx
├─ order/
│ └─ create_order.xlsx
6.2 执行效率优化
优化策略 | 实现方式 | 效果预估 |
---|---|---|
浏览器复用 | 使用setUpClass/tearDownClass | 减少80%启动时间 |
智能等待 | 显式等待替代固定sleep | 提升30%执行速度 |
并行执行 | 使用pytest-xdist插件 | 线性提升效率 |
七、版本兼容性说明
7.1 必须环境配置
# 安装指定版本库
pip install xlrd==1.2.0 paramunittest==1.0.2# 版本冲突说明:
# xlrd>=2.0.0 不支持xlsx格式
# paramunittest需要兼容Python3.13
7.2 常见错误处理
错误现象 | 原因分析 | 解决方案 |
---|---|---|
无法打开xlsx文件 | xlrd版本不正确 | 降级到1.2.0版本 |
参数映射失败 | Excel列名不匹配 | 检查标题行命名 |
元素定位超时 | 页面加载缓慢 | 添加显式等待机制 |
截图保存失败 | 路径权限问题 | 使用绝对路径或检查权限 |
八、完整代码
"""
Python :3.13.3
Selenium: 4.31.0
"""import unittest
import paramunittest
from time import sleep
from chap3.po import *
from .file_reader import ExcelReader# 处理 collections.Mapping 的兼容性问题
import collectionstry:collections.Mapping
except AttributeError:import collections.abccollections.Mapping = collections.abc.Mapping# 获取并解析Excel数据
# data = ExcelReader(r'E:\Py3Sel3Ifram\chap5\Demo.xlsx',
# sheet=0,
# excel_title=False).data# @paramunittest.parametrized(data[1],data[2],data[3])
# class TestOder(unittest.TestCase, Oder):
# def setParameters(self, name, pwd, ass, txt):
# self.name = name
# self.pwd = pwd
# self.ass = ass
# self.txt = txt
#
# def test_login(self):
# self.get()
# self.login(self.name, self.pwd)
# sleep(2)
# assert self.element('op.invalid_login').text == self.ass
# print(self.txt)# 获取并解析Excel数据
data = ExcelReader(r'E:\Py3Sel3Ifram\chap5\Demo.xlsx',sheet=0).data# data = (
# {'name': 'Testerr', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_admin is passed'},
# {'name': 'Sam', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_Sam is passed'},
# {'name': 'Tom', 'pwd': 'test', 'ass': 'Invalid Login or Password..', 'txt': 'test_login_Tom is passed'}
# )class TestLogin(unittest.TestCase, Oder):def test_login(self):for d in data:with self.subTest(d):self.get()self.login(d['name'], d['password'])sleep(2)# assert self.element(self.invalid_login).text == d['ass'], \# self.driver.save_screenshot(f'./{d["ass"]}.png')try:self.assertEqual(self.element('op.invalid_login').text, d['assertion'])except AttributeError:self.driver.save_screenshot(f'./{d["assertion"]}.png')raise AssertionErrorprint(d['message'])if __name__ == '__main__':unittest.main()
Excel的数据:
最佳实践建议:建议将测试数据与测试代码分离管理,使用独立的testdata目录存储各类测试数据文件。实际项目数据统计显示,采用数据驱动模式可降低60%的测试维护成本。
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀
相关文章:

21. 自动化测试框架开发之Excel配置文件的测试用例改造
21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...
避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践
1. 为什么需要动态IP? 在日常网络操作中,你是否遇到过: 爬虫被封:频繁请求目标网站,IP被限制访问。跨境业务受限:某些平台对特定地区的账号有限制。数据采集失败&#x…...

python-leetcode 69.最小栈
题目: 设计一个支持push,pop,top,操作,并能在常数时间内检索到最小元素的栈。 辅助栈法: 1:使用两个栈,一个主栈用于存储所有元素,另一个辅助栈用于存储当前元素的最小值 2: 每次push时,将元…...

YOLO中model.predict方法返回内容Results详解
1.执行代码 resultsmodel.predict(YOLO/ultralytics/assets/zidane.jpg) print(results) 结果如下: 可以看出结果是一个数组形式,数组里每个元素都是Ultralytics的Results对象 1)为什么结果是数组,而不是单个对象? …...
CF每日4题(1300-1400)
2026B 贪心 1300 我的思路和dalao很像 void solve(){int n;cin>>n;vector<int>a(n1);forr(i,1,n)cin>>a[i];int fg(n&1),ans;if(fg){ans1e1810;forr(i,1,n){//枚举把一个数去掉,其他两两组合int tmp1,j1;while (j<n){if(ji)j;int prea[j…...
golang学习大全
GO全路线学习(总结)大全 主题一 go语言基础知识讲解 go语言面向对象编程 go语言接口详解 go语言协程 主题二 web基础知识 构建web服务器 后续内容请大家持续关注,每月一主题,让各位读者能零基础、零成本学习go语言,我…...
falsk模型-flask_sqlalchemy增删改查
1、增、删、改 增 home_bp.route(/useradd) def user_add():users []for i in range(10,20):user User()user.name 冰冰 str(i)user.age 20iusers.append(user)try:db.session.add_all(users)db.session.commit()return jsonify({code:1,info:success})except Exception…...

K8S详解(5万字详细教程)
目录 一、集群管理命令 二、命名空间 1. 获取命名空间列表 2. 创建命名空间 3. 删除命名空间 4. 查看命名空间详情 三、Pod 1. Pod概述 2. Pod相位状态 3. 管理命令 3.1 获取命名空间下容器(pod)列表 3.2 查看pod的详细信息 3.3 创建 && 运行 3.4 删除pod …...

STL编程之vector
vector的基础概念:类 #include<iostream> #include<vector> using namespace std;int main() {int a[6] {1,2,4,5,6,7};vector<int> v { 1,3,6,8 };cout << v.capacity() << endl;v.push_back(8);cout << v.capacity() <…...

BI是什么意思?一文讲清BI的概念与应用!
目录 一、BI 是什么意思 1. BI 的定义 2. BI 的发展历程 3. BI 的核心组件 二、BI 的应用场景 1. 销售与市场营销 2. 财务管理 编辑3. 人力资源管理 4. 生产与运营管理 编辑三、选择合适的 BI 工具 1. 考虑企业的需求和规模 2. 评估工具的功能和性能 3. 关注工…...

[ 计算机网络 ] 深入理解TCP/IP协议
🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…...

微软开放代理网络愿景
🌐 Microsoft的开放式智能代理网络愿景 2025年05月20日 | AI日报  欢迎各位人工智能爱好者 微软刚刚在Build 2025大会上开启了备受期待的AI周活动,通过发布大…...
UDP三种通信方式
单播(Unicast) 单播是最常见的通信方式,数据从一个发送方传输到一个特定的接收方。发送方将数据包发送到接收方的IP地址和端口号,接收方通过监听指定的端口接收数据。单播适用于一对一的通信场景。 import java.net.DatagramPac…...

4-5月份,思科,华为,微软,个别考试战报分享
一定要看正版学习资料,在资料上省的钱可能变成后面的补考费,#网络工程师 #华为考试题库 #HCIP题库 #HCIA题库 #HCSP题库 #HCSE题库 #HCSA题库 #华为电力题库 #华为金融题库 #正版题库#思科考试 #CCNP题库 #CCNA题库 #HCIA考试 #CCIE题库 #CCDE题库 #电信…...

计算机网络-HTTP与HTTPS
文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信,解决网络互联兼容性问题。 网络模型是计算机网络中用于…...

信号波形发生器电路Multisim仿真
一、电路 二、示波器 三、示波器波形 四、所遇到的问题 1、只是把电路仿真出来了,具体原理没有理解。 解: 第一个波形是正弦波,是由电阻和电容的振荡电路产生的。 第二个波形是方波,产生的正弦波通过电压比较器输出一个方波。…...
深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践
深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言,结合Spring Boot和Spring Cloud的强大生态,…...
医学影像辅助诊断系统开发教程-基于tensorflow实现
源码下载地址: https://download.csdn.net/download/shangjg03/90873910 1. 简介 医学影像辅助诊断系统是利用计算机视觉和深度学习技术,帮助医生分析医学影像(如X光、CT、MRI等)并提供诊断建议的系统。本教程将指导你开发一个基于深度学习的胸部X光肺炎检测系统。 2. 准备…...
前端单点登录
前端实现单点登录(SSO) 单点登录(Single Sign-On,简称 SSO)是一种认证机制,允许用户在多个系统之间只需登录一次,就可以访问所有相关系统,而不需要重复输入账号和密码。它的目标是提…...

Spring AI 介绍
Python一直是AI领域的主要语言, 主要原因是因其语法简洁易学、拥有丰富且强大的AI专用库及框架、具备跨平台兼容性且社区生态活跃,能高效支撑AI算法开发、数据处理及模型部署。 Spring开发了AI开发的框架Spring AI,对于Java的开发者来说,也可以快速入手AI相关的开发了。 S…...

onlyoffice 源码 调试说明 -ARM和x86双模式安装支持
很多用户在调试onlyoffice源码最大的问题是如何搭建环境,这个难度很高,下面提供一键安装的方式,让普通用户也能快速调试源码。 OnlyOffice Document Server 基于源码运行的容器调试模式,凭借 Docker 容器化技术的核心优势,为开发者提供了跨平台、高兼容性…...

EXCEL在一列数据前统一添加负号
1.全选数据列 2.右键,设置单元格格式。输入-0,要保留三位小数就输入-0.000. 3.添加完成效果。...
从零开始打造个人主页:HTML/CSS/JS实战教程
本教程分为环境搭建、HTML 结构编写、CSS 样式布局、JavaScript 交互实现、部署上线等五大部分,覆盖从基础到进阶的核心知识点,并结合示例代码与最佳实践,帮助你快速上手并掌握前端开发基本技能。 介绍 个人主页是展示自我、分享作品的重要…...

UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings
33.2.6 Strings UEFI 环境中的 string 是使用 UCS-2 格式定义,每个字符由 16bit 数据表示。对于用户界面,strings 也是一种可以安装到 HIIdatabase 的一种数据。 为了本土化,每个 string 通过一个唯一标识符来识别,而每一个标识…...

高等数学基础(牛顿/莱布尼茨公式)
牛顿/莱布尼茨公式主要是为定积分的计算提供了高效的方法, 其主要含义在于求积分的函数( f ( x ) f(x) f(x))连续时候总是存在一条积分面积的函数( F ( x ) F(x) F(x))与之对应, 牛顿莱布尼茨公式吧微分和积分联系了起来, 提供了这种高效计算积分面积的方法 参考视频理解: http…...
Node.js路径处理指南:如何安全获取当前脚本目录路径
本文适用于 Node.js 14.x及以上版本,同时覆盖 CommonJS 和 ES Modules 模块系统 文章目录 一、为什么需要关注路径问题?二、三种核心方法详解方法1:经典方案 __dirname (CommonJS)方法2:ES Modules 解决方案方法3:动态…...
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...

2025年渗透测试面试题总结-华顺信安[实习]安全服务工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 华顺信安[实习]安全服务工程师 1. 自我介绍 2. 红蓝队经验 3. Shiro漏洞知识体系 4. APP渗透测试方法…...
按键精灵ios/安卓辅助工具高级函数OcrEx文字识别(增强版)脚本开发介绍
函数名称 OcrEx文字识别(增强版) 函数功能 返回指定区域内所有识别到的字符串、左上角坐标、区域宽高、可信度,无需自制字库,识别范围越小,效率越高,结果越准确 注意:安卓版按键APP需在设置…...
Unity3D HUD UI性能优化方案
前言 在Unity3D中实现高性能的HUD UI需要综合考虑渲染效率、CPU开销和内存管理。以下是分步的优化方案: 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 1. 降低Draw Call:合批与图集 …...