注:没有python基础的同学,请先移步"python基础专栏"
https://blog.csdn.net/annlin_/category_11671481.html
目录
一、接口自动化做什么?
1、接口自动化,就是获取用例,根据用例数据(数据驱动)去发请求,结束后查看测试结果 2、接口自动化就是在围绕全局变量、参数传递、参数化来做的
二、为什么学openpyxl?
1、openpyxl是用来操作excel 2、数据驱动(接口请求参数的数据都放在excel) 3、测开阶段用数据库来管理用例,目前使用excel来管理用例
三、开始学习
1、安装:pip install openpyxl
2、excel组成:xlsx文件、sheet表单、单元格
3、读取excel数据
1)、导入模块
# 导入openpyxl包中的加载方法load_workbook
from openpyxl import load_workbook
2)、获取excel文件对象
示例文件:case_data.xlsx
load_workbook(filename, read_only=False, keep_vba=KEEP_VBA,data_only=False, keep_links=True)
参数: filename:excel文件名称 read_only=False:只读,不可编辑 data_only=False:只读取公式,True:读取计算结果 该方法返回的是一个对象
# 将获取到的excel对象赋值给wb_obj
wb_obj = load_workbook(filename="case_data.xlsx", read_only=False)
# 结果为<openpyxl.workbook.workbook.Workbook object at 0x7f87f06158d0>
3)、获取sheet表单对象
方法1,获取所有的表单名称组成的列表
names = wb_obj.sheetnames
print(names)
# 输出为['login', 'upload']
方法2,根据名字获取,这个方法是比较常用的
sheet_obj = wb_obj["login"]
print(sheet_obj)
# 输出为<Worksheet "login">一个表单对象
方法3,根据索引获取
sheet_obj = wb_obj.worksheets[0]
print(sheet_obj)
# 输出为<Worksheet "login">一个表单对象
4)、获取单元格内容
方法1,使用行号获取
# 获取单元格对象sheet_obj["单元格标识"]
cell_obj = sheet_obj["B3"]
# 获取单元格内容
value = cell_obj.value
print(value)
# 输出结果为:校验短信
方法2,使用具体的行列号获取
# 使用cell(行号,列号)方法获取
res = sheet_obj.cell(2, 6)
# 将获取到的对象值读出来
res = res.value
print(res)
# 输出为:
# {
# "mobile": "#mobile#"
# }
5)、每次使用完要关闭文件
wb_obj.close()
6)、行操作的两种方法
方法1:按行获取内容,先获取最大行,再获取所有行号,然后使用行号循环去取每一行的内容。这种方法不智能,仅作为了解,可以熟悉一下获取原理
# 行操作
# 按行获取
max_row = sheet_obj.max_row # 获取最大行
max_column = sheet_obj.max_column # 获取最大列
print(max_row, max_column) # 输出4 10 (最大4行10列)
# 获取航对象
res = sheet_obj.rows
print(res)
# 输出<generator object Worksheet._cells_by_row at 0x7fa889f335d0>是一个生成器,
# 从生成器中获取单元格的对象(元组)
for obj in res:
print(obj)
# 输出为(<Cell 'login'.A1>, <Cell 'login'.B1>, <Cell 'login'.C1>, <Cell 'login'.D1>, <Cell 'login'.E1>......的元组
# 从元组中获取行号
for i in obj:
print(i)
# 输出为A1,B1,C1....A2,B2.....
# 获取每一行的值,等同于print(A1.value)
print(i.value)
# 输出为每一个单元格的值
方法2:行切片获取,使用如下方法iter_rows(min_row=None,max_rows=None,min_col=None,max_col=None,values_only=False)# 参数说明
# min_row=None,起始行的索引值(从1开始,int类型,默认1)
# max_row=None,结束行的索引值(从1开始,int类型,默认最大行的值)
# min_col=None,起始列的索引值(从1开始,int类型,默认1)
# max_col=None,结束列的索引值(从1开始,int类型,默认最大列的值)
# (重点)values_only=False,False返回单元格对象,True返回单元格对应的数据
# 切片原则是两头都包含,包含起始索引位置也包含索引结束位置
# 行切片
result = sheet_obj.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=True)
# 返回的是生成器,所以需要使用list转一下
print(list(result))
# 输出结果为[('id', 'title', 'method', 'is_upload', 'url', 'data', 'replace_sql', 'expected_data', 'extract_data', 'check'), ......]。
# 将每一行放在一个元组里,所有的行元组组成一个列表
6)、列切片,使用iter_cols()方法,用法同上述的行切片
result = sheet_obj.iter_cols(min_row=None, max_row=None, min_col=None, max_col=None, values_only=True)
print(list(result))
# 输出结果为:[('id', 1, 2, 3, None), ('title', '发送短信', '校验短信', '用户注册', '写进去的数据'), ('method', 'put', 'put', 'put', 'test_demo'),.....]
# 每一列的数据组成一个元组,所有的列元组组成一个列表。
4、往excel写或者修改数据(自动化阶段,不太用的上)
from openpyxl import load_workbook
wb_obj = load_workbook(filename="case_data.xlsx")
sheet_obj = wb_obj["login"]
# 这里有一个坑,修改数据或者写数据的之前,要先关掉文件,不然写不进去
# 写数据方法1,通过给单元格复制,修改数据或者写数据
sheet_obj["B3"] = "写进去的数据"
# 写数据方法2,使用具体的行列号,修改或者写数据
res = sheet_obj.cell(row=2, column=6, value="test_demo")
# 写完之后需要保存一下
wb_obj.save("case_data.xlsx")
wb_obj.close()