21. 自动化测试框架开发之Excel配置文件的测试用例改造

21. 自动化测试框架开发之Excel配置文件的测试用例改造

一、测试框架核心架构

1.1 组件依赖关系

python 复制代码
# 核心库依赖
import unittest           # 单元测试框架
import paramunittest      # 参数化测试扩展
from chap3.po import *    # 页面对象模型
from file_reader import ExcelReader  # Excel数据读取器

# 必须使用的库版本
# xlrd==1.2.0(支持xlsx格式)

二、Excel数据驱动实现

2.1 数据加载配置

python 复制代码
# 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实现(注释方案)

python 复制代码
@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)
方案特点:
  • 每个测试用例独立执行
  • 需要明确指定数据索引
  • 自动生成多个测试方法

3.2 使用subTest实现(当前方案)

python 复制代码
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')
                    raise
                print(d['message'])
方案优势:
  • 单测试方法管理多组数据
  • 失败时继续执行后续用例
  • 自动生成详细测试报告

四、关键技术点解析

4.1 数据驱动流程

复制代码
开始
├─ 读取Excel测试数据
├─ 遍历数据集合
│   ├─ 初始化浏览器
│   ├─ 执行登录操作
│   ├─ 验证断言结果
│   ├─ 成功:输出日志
│   └─ 失败:截图保存
└─ 生成测试报告

4.2 异常处理机制

python 复制代码
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 格式注意事项

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

六、工程实践建议

6.1 数据管理策略

python 复制代码
# 建议文件结构
testdata/
├─ login/
│   ├─ valid_login.xlsx
│   └─ invalid_login.xlsx
├─ order/
│   └─ create_order.xlsx

6.2 执行效率优化

优化策略 实现方式 效果预估
浏览器复用 使用setUpClass/tearDownClass 减少80%启动时间
智能等待 显式等待替代固定sleep 提升30%执行速度
并行执行 使用pytest-xdist插件 线性提升效率

七、版本兼容性说明

7.1 必须环境配置

bash 复制代码
# 安装指定版本库
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 复制代码
"""
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 collections

try:
    collections.Mapping
except AttributeError:
    import collections.abc

    collections.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 AssertionError
                print(d['message'])


if __name__ == '__main__':
    unittest.main()

Excel的数据:

最佳实践建议:建议将测试数据与测试代码分离管理,使用独立的testdata目录存储各类测试数据文件。实际项目数据统计显示,采用数据驱动模式可降低60%的测试维护成本。


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

相关推荐
AI刀刀1 小时前
豆包智能体对话导出后,如何构建长期归档与高效检索体系?
android·人工智能·word·excel·ai导出鸭
PhotonixBay1 小时前
共聚焦成像核心原理:针孔、PSF与三维形貌测量技术
人工智能·测试工具·算法
程序员小远1 小时前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
ZX0X学习中2 小时前
一句话让 AI 生成 Excel 多文件合并工具:码道 CLI 实战
人工智能·excel·ai编程·华为云码道
kft13144 小时前
Playwright + 本地 AI,从录制到自愈闭环的一站式自动化测试平台。
人工智能·测试工具
ClouGence4 小时前
零代码自动化测试工具回演 CueCast 新版本发布:数据变量、多标签页录制与登录准备能力上线
selenium·测试
得闲喝茶8 小时前
Excel——数据透析表
数据库·经验分享·笔记·其他·信息可视化·excel
Metaphor6921 天前
使用 Python 冻结 Excel 文件中的行、列和单元格
开发语言·python·excel