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

使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 26--数据驱动--参数化处理 Excel 文件 3

测试学习记录,仅供参考!

数据驱动

结合 pytest 框架参数化处理对测试用例做参数化;介绍 Json 格式文件、yaml 格式文件、Excel 格式文件 三种文件方式去做测试用例参数化;

三、使用Excel文件对测试用例做参数化

操作 Excel 文件的工具类已经封装完成,开始使用“在测试用例中做参数化”;

使用 Excel 读取测试用例与使用 Json、yaml 文件的流程是相似的,主要区别在于读取文件的方法不同;

1、优化 test_login.py 文件;

        1)、 导包引入读取 Excel 文件的 class ExcelDataReader: 工具类,使用类里面的方法;

        2)、使用 @pytest.mark.parametrize() 装饰器做参数化,第一个(参数)是接收后面一个可迭代参数(第二个参数)内容的参数,第一个参数 data(自定义名称),第二个参数是使用导入的 ExcelDataReader() 类中的某个方法“ExcelDataReader('./data/login_test.xlsx').read_multiple_rows()”,里面传要读取哪个 Excel 文件的数据(文件路径),然后调用类里面的方法;与读取 json、yaml 文件一样,更改读取方法即可,其他不动(自行更改代码);

import pytest
from selenium.webdriver.common.by import By
from time import sleep
from pageObject.login_page.login_page import LoginPage
# from util_tools.handle_data.operateJson import read_json
# from util_tools.handle_data.readYaml import read_yaml
from util_tools.handle_data.operateExcel import ExcelDataReaderclass TestLogin:# 使用参数化实现一条测试用例跑多种场景--可迭代对象里面有多少组数据就跑多少次测试用例@pytest.mark.parametrize('data', ExcelDataReader('./data/login_test.xlsx').read_multiple_rows())# 用一个 data(需与上面保持一致) 参数去接收参数化数据def test_login_success(self, get_driver, data):# 进行列表解包--通过两个参数去接收列表中的数据username, password = data# 传浏览器对象--再把结果返回login_page = LoginPage(get_driver)# 直接调用页面类中的 login 操作--里面需要输入两个参数(参数化传两个参数)login_page.login(username, password)# 断言结果success_ele = get_driver.find_element(By.XPATH, '//*[@id="ECS_MEMBERZONE"]/font/font')assert success_ele != ''sleep(2)

2、运行 run.py 主函数文件;(别忘记启动开源电商商城系统项目哦!)

能够看到是从第一行“表头”开始跑测试用例的,可以从调用的 read_multiple_rows() 方法处查看代码设置起始行、起始列(自行根据 Excel 文件内容去设置,若有写表头的话就从第 2 行开始,若没有表头的话就第 1 行;)

for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=max_col):

3、可以发现才 5 条(数据)测试用例就跑了六十多秒,如果再多一些的话,是不是就更慢了;

4、优化项目根目录下的 pytest.ini 配置文件;

设置 pytest 并发执行(多进程/多线程),使用 -n 参数设置 5 个线程去跑测试用例;

[pytest]
addopts = -vs -n 5testpaths = ./testcasepython_files = test_*.pypython_classes = Test*python_functions = test_*markers =lastfirstsecondP1P2

5、再次运行 run.py 主函数文件;

可以发现使用多线程去跑测试用例(同时打开了 5 个浏览器窗口),能够节省不少时间;

补充:拓展

openpyxl方法详解
工作簿操作

        openpyxl.load_workbook():加载存在的Excel工作簿

        openpyxl.Workbook():新建一个Excel工作簿

        wb.sheetnames:获取工作簿中的所有工作表名

        wb.active:获取或设置工作簿的活动工作表

        wb.create_sheet():在工作簿中新建一个工作表

        wb.remove_sheet():删除工作簿中的一个工作表

        wb.save():保存工作簿到文件

工作表操作

        ws = wb[sheetname]:根据名称获取工作表

        ws.title:获取或设置工作表标题

        ws.max_row:工作表总行数

        ws.max_column:工作表总列数

        ws.cell(row,column):获取单元格

        ws.append():在表尾追加行

        ws.insert_rows():在指定位置插入行

        ws.delete_rows():删除指定行

        ws.merge_cells():合并单元格

单元格操作

        cell.value:获取或设置单元格的值

        cell.row:单元格的行号

        cell.column:单元格的列号

        cell.data_type:单元格数据类型

        cell.font:获取字体对象,用于样式设置

        cell.alignment:获取对齐方式对象

        cell.border:获取边框对象

        cell.fill:获取背景填充对象

        cell.number_format:设置数字格式

        cell.hyperlink:为单元格设置超链接

数据操作

        ws.iter_rows():迭代工作表行

        ws.iter_cols():迭代工作表列

        ws.rows:以生成器方式返回所有行

        ws.columns:以生成器方式返回所有列

        ws.values:以嵌套列表方式返回所有值

        ws.formula:读取单元格公式

示例: Excel文件解析

参考:https://openpyxl.readthedocs.io/en/stable/

安装第三方库;例如:openpyxl

使用前需要先导包-- from openpyxl import Workbook

from openpyxl import Workbook

“W”字母大写时是引入这个类

from openpyxl import workbook

“w”字母小写时是引入这个模块,这个模块是这个文件,不是这个类

写入Excel文件

        示例1:

# 导包--切记正确引入,注意大小写字母
from openpyxl import Workbook
# 实例化这个类Workbook()--拿到Workbook()这个对象wb--新建一个空的xlsx工作簿
wb = Workbook()
# 使用wb.create_sheet创建表格testdata--拿到这个工资表worksheet
worksheet = wb.create_sheet('testdata')
# 写入方式1--直接指定单元格
worksheet['A1'] = 'A100'
worksheet['B1'] = 'B100'
# 写入方式2--使用worksheet.append追加--追加一个列表
worksheet.append(['hello', 'word'])
# save--保存文件--文件名
wb.save('testdata.xlsx')

运行→成功后→新生成一个“testdata.xlsx”文件→打开查看:

打开之后是--默认打开Sheet工作表,需手动切换到testdata工作表;

        运行时不能打开这个excel文件,否则会报错--没有权限,权限被拒绝,因为文件是打开状态,被打开的testdata.xlsx文件占有

        示例2:批量写入数据

# 导包--切记正确引入,注意大小写字母
from openpyxl import Workbook
# 实例化这个类Workbook()--拿到Workbook()这个对象wb--新建一个空的xlsx工作簿
wb = Workbook()
# 使用wb.create_sheet创建表格testdata--拿到这个工资表worksheet
worksheet = wb.create_sheet('testdata')
# 制定第一行表头
worksheet.append(['username', 'password'])
# 使用for循环--循环写入5次数据
for i in range(5):# 使用i下标索引填充来表示worksheet.append([f'test{i}', '123456'])
# save--保存文件--文件名
wb.save('testdata.xlsx')

运行→成功后→新生成一个“testdata.xlsx”文件→打开查看:testdata工作表

        示例3:

# 导包--切记正确引入,注意大小写字母
from openpyxl import Workbook
# 实例化这个类Workbook()--拿到Workbook()这个对象wb--新建一个空的xlsx工作簿
wb = Workbook()
# 使用wb.create_sheet创建表格testdata--拿到这个工资表worksheet
worksheet = wb.create_sheet('testdata')
# 制定第一行表头
worksheet.append(['username', 'password'])
# 使用for循环--写入10次数据
for i in range(1, 11):# 使用i下标索引填充来表示worksheet.append([f'username{i}', f'password{i}'])
# save--保存文件--文件名
wb.save('testdata.xlsx')

运行→成功后→新生成一个“testdata.xlsx”文件→打开查看:testdata工作表

读取Excel文件

使用前需要先导包:from openpyxl import load_workbook

        示例1:

# 导包
from openpyxl import load_workbook
# 使用load_workbook()加载文件--文件名--注意文件路径
wb = load_workbook('testdata.xlsx')
# 打印工作表名称
print(wb.sheetnames)

文件路径:同一级目录下,可以使用相对路径;若不是同一级文件目录,建议使用绝对路径

['Sheet', 'testdata']进程已结束,退出代码为 0

        示例2:提取数据

                from openpyxl import load_workbook

                from openpyxl.worksheet.worksheet import Worksheet

# 导包
from openpyxl import load_workbook
# 指定类型
from openpyxl.worksheet.worksheet import Worksheet
# 使用load_workbook()加载文件--文件名--注意文件路径
wb = load_workbook('testdata.xlsx')
# 引入类--指定类型--可以拿到一些它的常用方法
ws: Worksheet = wb['testdata']
# 使用for循环
for row in ws.values:# 打印每一行数据print(row)
('username', 'password')
('test0', '123456')
('test1', '123456')
('test2', '123456')
('test3', '123456')
('test4', '123456')进程已结束,退出代码为 0

        示例3:可以把元组放到一个列表里面

# 导包
from openpyxl import load_workbook
# 指定类型
from openpyxl.worksheet.worksheet import Worksheet
# 使用load_workbook()加载文件--文件名--注意文件路径
wb = load_workbook('testdata.xlsx')
# 引入类--指定类型--可以拿到一些它的常用方法
ws: Worksheet = wb['testdata']
# 定义一个空列表
test_data = []
# 使用for循环
for row in ws.values:# 每循环一次往test_data列表中追加一次test_data.append(row)
# 打印列表test_data
print(test_data)
[('username', 'password'), ('test0', '123456'), ('test1', '123456'), ('test2', '123456'), ('test3', '123456'), ('test4', '123456')]进程已结束,退出代码为 0

未完待续。。。

http://www.dtcms.com/a/618197.html

相关文章:

  • 第41节:第三阶段总结:打造一个AR家具摆放应用
  • 建设网站流程2022年最新新闻播报稿件
  • 网站地图的作用长沙网站开发设计
  • 【读代码】最新端侧TTS模型NeuTTS-Air
  • 做装修网站多少钱四川成都住建局官网
  • Microsoft 远程桌面app,支持挂机宝,云主机服务器
  • 基于MATLAB的粒子群优化(PSO)算法对25杆桁架结构进行优化设计
  • 智能驾驶:从感知到规控的自动驾驶系统全解析
  • 练习项目:基于 LangGraph 和 MCP 服务器的本地语音助手
  • 在 VMware 的 Ubuntu 22.04 虚拟机和 Windows 主机之间设置共享剪贴板
  • 淄博专业网站建设哪家专业公司装修设计工程
  • 金融网站的设计中和阗盛工程建设有限公司网站
  • 《JavaScript基础-Day.4》笔记总结
  • 关于C++中的预编译指令
  • 做网站的重要性深圳程序开发
  • 其他落地手册:facebook实现与音视频剖析
  • 建站方法移动课程播放网站建设多少钱
  • ZJUCTF2025(预赛+决赛)-我的writeup
  • 2025.11.16 AI快讯
  • Java分治算法题目练习(快速/归并排序)
  • Python 生信进阶:Biopython 库完全指南(序列处理 + 数据库交互)
  • 基于单片机的功率因数校正与无功补偿系统设计
  • 【计算机网络笔记】第六章 数据链路层
  • 网站开发工作前景电商哪个平台销量最好
  • 正规的网站建设官网动漫设计难不难
  • 运行,暂停,检查:探索如何使用LLDB进行有效调试
  • YOLOv8交通信号灯检测
  • asp.net企业网站管理系统工厂型企业做网站
  • linux gpib 驱动
  • 中壹建设工程有限公司官方网站搜索引擎实训心得体会