基于Python的接⼝⾃动化-读写excel⽂件
引⾔
使⽤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:
⼆、xlrd操作excel⽂件的数据读取
新建⼀个excel⽂件,⽂件名称:excel_test.xlsx,⽂件编辑有两个sheet表,内容如下:
sheet1:
sheet2:
(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 = ws    # 获取⾏数
ncols = ls    # 获取列数
nrows_data = w_values(1)  # 获取第⼆⾏数据,返回的是列表
ncols_data = l_values(0)  # 获取第⼀列数据,返回的是列表
cell = ll(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不同数据类型的返回问题,如读取⽇期格式的数据
⼀般使⽤ll(rowx,colx)⽅法获取单元格数据,单元格数据类型判断可以使⽤如下代码:
ll(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 = w_values(1)  # 获取第⼆⾏数据,返回的是列表
ncols_data = l_values(0)  # 获取第⼀列数据,返回的是列表
cell = ll(1,2)            # 获取单元格数据,如第⼆⾏,第三列数据,返回的是浮点数
data_value = xlrd.xldate_as_ll_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 (ll(row,col).ctype == 3):
date_value = xlrd.xldate_as_ll_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')
style = xlwt.XFStyle()                        # 初始化表格样式
style.num_format_str = 'M/D/YY'              # 设置时间格式,如:M/D/YY
sheet.write(5, 1, w(), 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')
# 向单元格添加超链接
python怎么读入excelsheet.write(6, 0, xlwt.Formula('HYPERLINK("www.baidu/";"baidu")'))
workbook.save('book.xlsx')                  # 保存到book.xlsx中
 运⾏后输出excel效果如下:
四、xlutils操作excel⽂件
(1)拷贝excel表格
xlutils模块下的copy可以复制拷贝excel⽂件,代码⽰例:
import xlrd
py 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
py import copy
excel_file = xlrd.open_workbook("book.xlsx")
new_file = copy(excel_file)
sheet = _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': 'imp-t.tfgreenroad:18092/console_api/recep/tv/list', 'id': 1.0, 'params': '{ "queryMsg":"","regionCode":"","devtypeCode":"","online":"","offset":"","limit":1,"type":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_re  {'module': '平台管理', 'url': 'imp-t.tfgreenroad:18092/console_api/manage/appsys/info', 'id': 2.0, 'params': '', 'method': 'post', 'actual_res': '', 'data': '{"appName": "hahh","appId": "34434343","appUrl": "12306","appCode": "89","rem  {'module': '平台管理', 'url': 'imp-t.tfgreenroad: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': '' {'module': '平台管理', 'url': 'imp-t.tfgreenroad:18092/console_api/manage/devty
pe/list', 'id': 4.0, 'params': '{ "queryMsg":"15002","offset":"","limit":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '设备分类]
 封装向excel写⼊数据的类,代码⽰例:
py 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 = _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操作的封装,后续接⼝测试数据的读取和写⼊就依靠这两个类了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。