基于Python的接口自动化读写excel文件的方法


Posted in Python onJanuary 15, 2021

引言

使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来很冗余和难以清晰的阅读以及维护,试想如果所有的接口测试数据都写在代码中,接口参数或者测试数据需要修改,那不得每个代码文件都要一一改动?。因此,这种不高效的模式不是我们想要的。所以,在自动化测试中就有个重要的思想:测试数据和测试脚本分离,也就是测试脚本只有一份,其中需要输入数据的地方会用变量来代替,然后把测试输入数据单独放在一个文件中,这个存放测试输入数据的文件,通常是表格的形式或者其他格式文件,如excel文件、json文件、xml文件、txt文本文件等等。在python进行接口自动化测试时,为了方便管理和存储测试用例数据,一般将测试数据编写存储在excel文件中,测试脚本通过读取excel文件来实现测试数据加载,并运行得出测试用例数据执行的结果,并回写测试结果到excel文件中,这样就实现了测试脚本和数据的分离。而python操作excel文件的读写,这里需要安装并引入第三方模块:xlrd和xlwt以及xlutils,xlrd为读取excel模块,xlwt为向excel写数据的模块,xlutils可以复制excel并修改excel中的数据。下面就具体介绍xlrd和xlwt操作excel文件提供的通用方法和技巧,以及xlutils如何复制和修改excel,达到操作excel读写的目的。

一、xlrd、xlwt以及xlutils安装

1.使用pip安装

pip install xlrd
pip install xlwt
pip install xlutils

2.在PyCharm中安装

直接检索需要安装的模块名称即可,如xlrd:

基于Python的接口自动化读写excel文件的方法

二、xlrd操作excel文件的数据读取

新建一个excel文件,文件名称:excel_test.xlsx,文件编辑有两个sheet表,内容如下:

sheet1:

基于Python的接口自动化读写excel文件的方法

sheet2:

基于Python的接口自动化读写excel文件的方法

(1)打开excel文件,获取excel的sheet名

编辑如下代码:

import xlrd
file = xlrd.open_workbook("excel_test.xlsx")
all_sheet = file.sheet_names() # 获取所有的工作簿名
sheet_name1 = file.sheet_names()[0] # 通过sheet下标获取,第一个sheet下标为0
sheet_name2 = file.sheet_by_index(0).name # 通过sheet索引获取sheet名
print(all_sheet)
print(sheet_name1)
print(sheet_name2)
-----------------------------------------
# 返回结果
['员工信息表', 'api测试用例']
员工信息表
员工信息表

(2)获取sheet工作表页的对象

代码示例:

import xlrd
file = xlrd.open_workbook("excel_test.xlsx")
sheet_name1 = file.sheet_names()[0]
sheet1_obj = file.sheet_by_name(sheet_name1) # 通过sheet名获取sheet对象
sheet2_obj = file.sheet_by_index(1) # 通过sheet索引获取sheet对象
print(sheet1_obj)
print(sheet2_obj)
------------------------------------
# 返回结果
<xlrd.sheet.Sheet object at 0x0000000002AA09B0>
<xlrd.sheet.Sheet object at 0x0000000002AA0978>

(3)获取sheet工作表的行、列数,整行、整列数据,具体的单元格数据

代码示例:

import xlrd
file = xlrd.open_workbook("excel_test.xlsx")
sheet = file.sheet_by_index(0) # 通过sheet索引获取sheet对象
nrows = sheet.nrows # 获取行数
ncols = sheet.ncols # 获取列数
nrows_data = sheet.row_values(1) # 获取第二行数据,返回的是列表
ncols_data = sheet.col_values(0) # 获取第一列数据,返回的是列表
cell = sheet.cell(1,2)  # 获取单元格数据,如第二行,第三列数据
print(nrows)
print(ncols)
print(nrows_data)
print(ncols_data)
print(cell)
-------------------------------
# 返回结果
6
5
['王五', '男', 32883.0, 'java开发工程师', 233.0]
['姓名', '王五', '李四', '张三', '小红', '小明']
xldate:32883.0 # 这里日期数据直接返回成浮点数了

 常见读取excel不同数据类型的返回问题,如读取日期格式的数据

一般使用sheet.cell(rowx,colx)方法获取单元格数据,单元格数据类型判断可以使用如下代码:

print(sheet.cell(1,2).ctype)
------------
# 返回日期数据的结果
3

注:ctype : 0 empty,1 string, 2 number,3 date, 4 boolean, 5 error

读取单元格日期数据为浮点数的处理方式:

代码如下:

import xlrd
from datetime import date
file = xlrd.open_workbook("excel_test.xlsx")
sheet = file.sheet_by_index(0) # 通过sheet索引获取sheet对象
nrows_data = sheet.row_values(1) # 获取第二行数据,返回的是列表
ncols_data = sheet.col_values(0) # 获取第一列数据,返回的是列表
cell = sheet.cell(1,2)  # 获取单元格数据,如第二行,第三列数据,返回的是浮点数
data_value = xlrd.xldate_as_tuple(sheet.cell_value(1,2) ,file.datemode) # xldate_as_tuple()方法得到日期数据年月日时分秒的值并返回为元组
datatime2 = date(*data_value[:3]).strftime('%Y/%m/%d') # 截取元组中的前三位,即年月日的值传给data,并进行时间格式化
 
print(cell)
print(data_value)
print(datatime2)
 
-----------------------
# 返回结果
xldate:32883.0
(1990, 1, 10, 0, 0, 0)
1990/01/10

因此在读取excel单元格数据,如遇到是日期格式的数据,可以加上如下代码判断并处理:

if (sheet.cell(row,col).ctype == 3):
 date_value = xlrd.xldate_as_tuple(sheet.cell_value(row,col),file.datemode)
 date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')

三、xlwt向excel文件写入数据

xlwt一般用于向excel文件写入数据,简单示例如下:

import xlwt
 
workbook = xlwt.Workbook(encoding = 'utf-8') # 创建工作簿
sheet = workbook.add_sheet('api_test') # 添加一个sheet
data = sheet.write(0,0,'test')  # 向第一行第一列写入数据:test
workbook.save('book.xlsx')   # 保存到book.xlsx中

 运行完成后会在该py文件的同级目录下生成一个book.xlsx的excel文件,并新增了api_test的sheet表名,第一行第一列写入数据:test

 向excel写入数据时,可以设置单元格长宽、单元格合并、写入时间格式数据以及添加超链接等

代码示例:

import xlwt
import datetime
workbook = xlwt.Workbook(encoding = 'utf-8') # 创建工作簿
sheet = workbook.add_sheet('api_test') # 添加一个sheet
data = sheet.write(4,0,'test')
 
sheet.col(0).width = 5000   # 设置单元格宽度
 
style = xlwt.XFStyle()    # 初始化表格样式
style.num_format_str = 'M/D/YY'  # 设置时间格式,如:M/D/YY
sheet.write(5, 1, datetime.datetime.now(), style) # 写入时间格式数据
 
# 合并多列和和并多行
# 表示合并的行数是:按行索引,从0行到第0行,按列索引从0列到第3列,合并后并写入数据:test1
sheet.write_merge(0, 0, 0, 3, 'test1')
# 表示合并的行数是:按行索引,从1行到第2行,按列索引从0列到第3列,合并后并写入数据:test2
sheet.write_merge(1, 2, 0, 3, 'test2')
 
# 向单元格添加超链接
sheet.write(6, 0, xlwt.Formula('HYPERLINK("https://www.baidu.com/";"baidu")'))
 
workbook.save('book.xlsx')   # 保存到book.xlsx中

 运行后输出excel效果如下:

基于Python的接口自动化读写excel文件的方法

四、xlutils操作excel文件

(1)拷贝excel表格

xlutils模块下的copy可以复制拷贝excel文件,代码示例:

import xlrd
from xlutils.copy import copy
excel_file = xlrd.open_workbook("book.xlsx")
new_file = copy(excel_file) # 拷贝文件对象
new_file.save("book1.xlsx") # 保存为excel文件

 运行以上代码会在同级目录下生成一个book1.xlsx的excel文件,该文件和book.xlsx一样,只是文件名称不一样而已,也就是复制excel文件了

(2)修改excel文件内容

除了copy为其他excel文件外,也可以直接copy文件修改后,保存为同名的文件,那修改的内容将直接覆盖原excel文件,达到修改的目的

示例:

import xlrd
from xlutils.copy import copy
excel_file = xlrd.open_workbook("book.xlsx")
new_file = copy(excel_file)
sheet = new_file.get_sheet(0) # 获取表格的第一个sheet
sheet.write(0,1,"测试") # 第一行第二列写入:测试
sheet.write(1,1,"测试1") # 第二行第二列写入:测试1
new_file.save("book.xlsx")

 运行后book.xlsx表会修改更新

五、封装操作excel读和写的类

通过上面介绍,基本具备使用xlrd、xlwt、xlutils模块进行excel文件数据读取和向excel文件中写入数据,在进行接口测试时,我们说到需要:测试数据和测试脚本分离,后续的接口测试用例数据,我们统一写入excel表格中,然后通过操作excel来读取测试数据并将测试结果回填到excel中。因此,咱们需要对向excel读取数据和向excel写入数据的操作进行封装。

我们操作上面的api测试用例这个sheet,封装读取excel数据的类,代码示例:

from xlrd import open_workbook
class Readexcel():
 
 def excel_data_list(self, filename, sheetname):
 '''
 :param filename: excel文件名称
 :param sheetname: excel中表格sheet名称
 :return: data_list
 '''
 data_list = []
 wb = open_workbook(filename) # 打开excel
 sh = wb.sheet_by_name(sheetname) # 定位工作表
 header = sh.row_values(0) # 获取标题行的数据
 for i in range(1, sh.nrows): # 跳过标题行,从第二行开始获取数据
  col_datas = dict(zip(header, sh.row_values(i))) # 将每一行的数据,组装成字典
  data_list.append(col_datas) # 将字典添加到列表中 ,列表嵌套字典,每个元素就是一个字典
 return data_list
 
if __name__ == '__main__':
 Readexcel()

 上面代码封装了读取excel数据的类,将每一行数据读取出来组装成字典并添加到列表中

实例化运行:

data_list = Readexcel().excel_data_list('excel_test.xlsx','api测试用例')
 print(data_list)
-----------------------
# 返回结果
[
 {'module': '视频安防', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/recep/tv/list', 'id': 1.0, 'params': '{ "queryMsg":"","regionCode":"","devtypeCode":"","online":"","offset":"","limit":1,"type":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '分页查询视频安防设备列表', 'files': ''},
 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info', 'id': 2.0, 'params': '', 'method': 'post', 'actual_res': '', 'data': '{"appName": "hahh","appId": "34434343","appUrl": "http://12306.com","appCode": "89","remark":""}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '应用管理-单个应用系统添加', 'files': ''},
 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info/upappid/89', 'id': 3.0, 'params': '', 'method': 'put', 'actual_res': '', 'data': '{"appId": "3232327676888"}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '应用管理-修改应用appId', 'files': ''},
 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/devtype/list', 'id': 4.0, 'params': '{ "queryMsg":"15002","offset":"","limit":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '设备分类-分页获取设备类型', 'files': ''}
]

 封装向excel写入数据的类,代码示例:

from xlutils.copy import copy
from xlrd import open_workbook
 
class Write_excel():
 def write_result(self, filename, row, col1,col2,actual_res, test_res,sheet_name):
 '''
 :param filename: 文件名
 :param row: 要写回的行
 :param col1: 要写回的列
 :param col2: 要写回的列
 :param actual_res: 实际结果
 :param test_res: 测试结果 :pass/failed
 :param sheet_name:指定的sheet表索引
 :return:
 '''
 old_workbook = open_workbook(filename)
 # 将已存在的excel拷贝进新的excel
 new_workbook = copy(old_workbook)
 # 获取sheet
 new_worksheet = new_workbook.get_sheet(sheet_name) # 第n个sheet,0表示第一个sheet
 # 写入数据
 new_worksheet.write(row, col1, actual_res)
 new_worksheet.write(row, col2, test_res)
 # 保存
 new_workbook.save("book.xlsx")
 
if __name__ == '__main__':
 Write_excel()

这样我们就完成了读写excel操作的封装,后续接口测试数据的读取和写入就依靠这两个类了。

到此这篇关于基于Python的接口自动化读写excel文件的文章就介绍到这了,更多相关Python接口自动化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
django连接oracle时setting 配置方法
Aug 29 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
通过代码实例了解Python sys模块
Sep 14 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
Python全局变量与global关键字常见错误解决方案
Oct 05 Python
python中xlutils库用法浅析
Dec 29 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 #Python
python爬取微博评论的实例讲解
Jan 15 #Python
pycharm 复制代码出现空格的解决方式
Jan 15 #Python
pycharm 实现复制一行的快捷键
Jan 15 #Python
pycharm 快速解决python代码冲突的问题
Jan 15 #Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 #Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 #Python
You might like
php 方便水印和缩略图的图形类
2009/05/21 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
Firefox div高度自适应
2009/04/28 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
Python单链表的简单实现方法
2014/09/23 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
初中物理教学反思
2014/01/14 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL