引言
使用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 = 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
读取单元格日期数据为浮点数的处理方式:
代码如下:
上面代码封装了读取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接口自动化内容请搜索社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持社区! |