基于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中去空格函数的用法
Aug 21 Python
使用Python编写一个模仿CPU工作的程序
Apr 16 Python
Python解析json文件相关知识学习
Mar 01 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
python进行TCP端口扫描的实现
Dec 21 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
Python如何省略括号方法详解
Mar 21 Python
Python super()方法原理详解
Mar 31 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
解决GD中文乱码问题
2007/02/14 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
php面向对象重点知识分享
2019/09/27 PHP
js tab效果的实现代码
2009/12/26 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
打架检讨书100字
2014/01/08 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
社区反邪教工作方案
2014/06/16 职场文书
师德承诺书
2015/01/20 职场文书
nginx之内存池的实现
2022/06/28 Servers