当前位置: 首页 > news >正文

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 数据结构标准

列名类型说明
namestr用户名输入
passwordstr密码输入
assertionstr预期断言文本
messagestr测试结果描述

5.2 格式注意事项

  1. 第一行必须为标题行
  2. 各列顺序需与代码参数对应
  3. 文本型断言值需完全匹配
  4. 避免使用特殊字符作为文件名

六、工程实践建议

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%的测试维护成本。


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

http://www.xdnf.cn/news/544915.html

相关文章:

  • [特殊字符] React Fiber架构与Vue设计哲学撕逼实录
  • 【Linux笔记】——简单实习一个日志项目
  • 以太联 - Intellinet 闪耀台北 SecuTech 国际安全科技应用博览会
  • C及C++的音频库与视频库介绍
  • MATLAB实现GAN用于图像分类
  • Spring Boot 集成 Elasticsearch【实战】
  • JAVA EE(进阶)_HTML
  • PHP、JAVA、Shiro反序列化
  • Index-AniSora技术升级开源:动漫视频生成强化学习
  • MySQL 8.0 OCP 英文题库解析(六)
  • 系统架构设计(十七):微服务数据一致性和高可用策略
  • anaconda、miniconda、conda的关系及miniconda安装
  • 虚拟环境中VSCode运行jupyter文件
  • 2025年AI搜索引擎发展洞察:技术革新与市场变革
  • 数据库----软考中级软件设计师(自用学习笔记)
  • ShenNiusModularity项目源码学习(27:ShenNius.Admin.Mvc项目分析-12)
  • [创业之路-369]:企业战略管理案例分析-8-战略制定-战略制定起点:差距分析
  • Jenkins服务器配置密钥对
  • 三、【数据建模篇】:用 Django Models 构建测试平台核心数据
  • windows维护工具vip版
  • Django基础(二)Django 项目基础操作
  • NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
  • GO语言学习(六)
  • WSL虚拟机整体迁移教程(如何将WSL从C盘迁移到其他盘)
  • 【计算机方向海外优质会议推荐】第二届图像处理、机器学习与模式识别国际学术会议(IPMLP 2025)
  • 下载Ubuntu 64 位
  • 图像处理基础知识
  • YOLOv8 的双 Backbone 架构:解锁目标检测新性能
  • Java EE初阶——定时器和线程池
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 与 Cline 快速构建AI编程助手