6.Python读取excle(测试用例)
2022-11-15 本文已影响0人
小小一颗卤蛋
版本V1
需求场景:写一个读取excle的文件代码
需求分析:
1.需要获取的数据:请求数据,预期的响应体
2.需要返回什么样数据类型
使用场景:这个数据给自动化测试框架使用pytest做ddt: [(请求体1,响应数据1),(请求体2,预期响应数据2)]
代码方案:
1、打开这个excle
2、读取响应列数据
3、组装结果数据
excle 表如下所示:
image.png
handle_excelV1.py
'''
输入参数:
excel
文件路径excel
具体的sheet表
获取的列数据标号
输出数据(返回值):[(body_1,resp_1),(body_2,resp_2)]
'''
import xlrd
def get_excle_data(file_path,sheet_name):
res_list = []
# 1 -打开excle 文件
# formatting_info = True 保持原格式打开文件
work_book = xlrd.open_workbook(file_path,formatting_info = True )
# 2 - 制定对应的表
print(work_book.sheet_names()) # 查看所有的表名
work_sheet = work_book.sheet_by_name(sheet_name)
# ------------------补充操作--------------------
print(work_sheet.row_values(0)) # 获取第0行的数据(第一行,一般为表头)
print(work_sheet.col_values(0)) # 获取第0列的数据(第一列)
print(work_sheet.cell(0,0).values) # 获取单元格对应的数据---(行号,列号)
#------------------------------------------------------------
# 3 - 获取指定的数据
row_idx = 0
for one in work_sheet.col_values(0)
req_body = work_sheet.ceel(row_idx ,9).values # cell(行编号,列编号)
resp_body = work_sheet.ceel(row_idx ,11).values # cell(行编号,列编号)
row_id += 1 # 下一行循环
# print(req_body,resp_body)
res_list.append((req_body,resp_body))
return res_list
if __name__ == '__main__':
get_excel_data('../data/Delivery_System_V1.5.xls','登录模块')
V1 的问题:如果用例表存在非这个接口的用例(例如:管理模块)则会导致自动化测试失败;若后续需要获取其他数据,需要二次修改代码(麻烦)
建议: 需要传递一个对应的接口的筛选条件;提供可拓展性,以后可能需要获取用的标题
版本V2
要求:以上的建议
需求分析:
· 使用特定标识去识别用例
· 使用一个可变数量参数*args
思路:
方案1:用户直接传递数
get_excel_data(excelpath,sheetName,caseName,[9,10,5])
# caseName是用例名称(login001中的login,或者update001的update),[9,11,5]获取第9 10 5列的数据
# 代码可读性差,无法知道9 11,5是什么
方案2:用户名:列名
get_excel_data(excelpath,sheetName,caseName,['URL','请求数据'])
# 代码可读性好,好理解业务,但是不方便调用,列名--转化--下标
handle_excelV2.py
'''
输入参数:
excel
文件路径excel
具体的sheet表
获取的列数据标号
输出数据(返回值):[(body_1,resp_1),(body_2,resp_2)]
'''
import xlrd
def get_excel_data(file_path,sheet_name,case_name,*args):#*['标题','请求参数','响应预期结果']
"""
:param file_path: 文件的路径
:param sheet_name: 具体操作的sheet名
:return: [(),()]
"""
res_list = []#存放结果的
#1-打开excel文件
#formatting_info = True 保持原样式
work_book= xlrd.open_workbook(file_path,formatting_info=True)
#2-指定对应的表
#print(work_book.sheet_names())#查看所有的表名
work_sheet = work_book.sheet_by_name(sheet_name)
# print(work_sheet.row_values(0))#打印第一行数据
print(work_sheet.col_values(0)) # 打印第一列数据
#--------------列名--转化--列下标-------------
#args == ['标题','请求参数','响应预期结果']
col_indexs = []#列表
#列名是第0行数据
for col_name in args:# args 元组
col_indexs.append(work_sheet.row_values(0).index(col_name))
print('需要获取的列名--->',col_indexs)
#------------------------------------------
#3-获取指定数据
row_idx = 0
for one in work_sheet.col_values(0):
if case_name in one:# listShoping in listShoping005
# req_body = work_sheet.cell(row_idx,9).value#cell(行编号,列编号)
# resp_data = work_sheet.cell(row_idx, 11).value # cell(行编号,列编号)
col_datas = []#每一行所有获取的列数据
for num in col_indexs:#[4, 9, 11]
tmp = work_sheet.cell(row_idx,num).value# cell(行编号,列编号)
col_datas.append(tmp)
res_list.append(tuple(col_datas))#[(),()]
row_idx += 1#下一行循环
return res_list
if __name__ == '__main__':
res = get_excel_data('../data/Delivery_System_V1.5.xls','我的商铺','listshopping',*['优先级','URI'])# *[] 解包
print(res)
V2版本问题: 优先级或者冒烟测试,不去执行所有的用例
建议:定制化执行用例
1- pytest有对模块选择,或者对接口选择的-mark,只能到接口层,不能对接口用例层
2- 用例级别筛选:使用数据驱动@pytest.mark.paramsxxxxx(用例数据)
版本V3
需求:优先级或者冒烟测试(不是执行所有测试用例)
用例挑选:
1、全部运行 all 默认模式
2、只选择某一个 tc003
3、连续用例 tc003-tc006
4、组合型 ['tc003','tc005-tc007','tc009']
import xlrd
def get_excel_data(file_path,sheet_name,case_name,*args,run_case=['all']):#*['标题','请求参数','响应预期结果']
"""
:param file_path: 文件的路径
:param sheet_name: 具体操作的sheet名
:return: [(),()]
"""
res_list = []#存放结果的
#1-打开excel文件
#formatting_info = True 保持原样式
work_book= xlrd.open_workbook(file_path,formatting_info=True)
#2-指定对应的表
#print(work_book.sheet_names())#查看所有的表名
work_sheet = work_book.sheet_by_name(sheet_name)
#--------------列名--转化--列下标-------------
#args == ['标题','请求参数','响应预期结果']
col_indexs = []#列表
#列名是第0行数据
for col_name in args:# args 元组
col_indexs.append(work_sheet.row_values(0).index(col_name))
#print('需要获取的列名--->',col_indexs)
#------------------------------------------
#----------------用例筛选--------------------
#组合型 ['all','003','005-007','009']
run_case_data = []#需要运行的用例
if 'all' in run_case:#所有的用例全部运行!
run_case_data = work_sheet.col_values(0)#['Login003']
else:#不是全部运行---['003','005-007','009']
for one in run_case:#one == '003','005-007','009'
if '-' in one:#连续的用例---'005-007'
start,end = one.split('-')#获取对应的数值 '005' '007'--字符串类型
for num in range(int(start),int(end)+1):
run_case_data.append(case_name+f'{num:0>3}')# 5 6 7---Login005
else:#不连续的用例---'005'
run_case_data.append(case_name+f'{one:0>3}')
#-----------------------------------------
print('运行的用例--->',run_case_data)
#3-获取指定数据
row_idx = 0
for one in work_sheet.col_values(0):
if case_name in one and one in run_case_data:# listShoping in listShoping005
# req_body = work_sheet.cell(row_idx,9).value#cell(行编号,列编号)
# resp_data = work_sheet.cell(row_idx, 11).value # cell(行编号,列编号)
col_datas = []#每一行所有获取的列数据
for num in col_indexs:#[4, 9, 11]
tmp = work_sheet.cell(row_idx,num).value# cell(行编号,列编号)
col_datas.append(tmp)
res_list.append(tuple(col_datas))#[(),()]
row_idx += 1#下一行循环
return res_list
if __name__ == '__main__':
res = get_excel_data('../data/Delivery_System_V1.5.xls','登录模块','Login',*['请求参数','响应预期结果'],run_case=['all','001','003-005','006'])# *[] 解包
print(res)
for one in res:
print(one)
读取配置版本
在配置文件中新建文件excelConfig.yml如下
file_name:
col_name:
- 标题
- 请求参数
- 响应预期结果
在utils中新建handle_excel.py文件
import xlrd
from utils.handle_yaml import get_yaml_data
from utils.handle_path import config_path,data_path
import os
def get_excel_data(sheet_name,case_name,run_case=['all']):#*['标题','请求参数','响应预期结果']
"""
:param file_path: 文件的路径
:param sheet_name: 具体操作的sheet名
:return: [(),()]
"""
#---------------------------------
#读取excel配置文件
config_data = get_yaml_data(os.path.join(config_path,'excelConfig.yml'))
#excel路径获取
file_path = os.path.join(data_path,config_data['file_name'])
args = config_data['col_name']
#---------------------------------
res_list = []#存放结果的
#1-打开excel文件
#formatting_info = True 保持原样式
work_book= xlrd.open_workbook(file_path,formatting_info=True)
#2-指定对应的表
#print(work_book.sheet_names())#查看所有的表名
work_sheet = work_book.sheet_by_name(sheet_name)
#--------------列名--转化--列下标-------------
#args == ['标题','请求参数','响应预期结果']
col_indexs = []#列表
#列名是第0行数据
for col_name in args:# args 元组
col_indexs.append(work_sheet.row_values(0).index(col_name))
#print('需要获取的列名--->',col_indexs)
#------------------------------------------
#----------------用例筛选--------------------
#组合型 ['all','003','005-007','009']
run_case_data = []#需要运行的用例
if 'all' in run_case:#所有的用例全部运行!
run_case_data = work_sheet.col_values(0)#['Login003']
else:#不是全部运行---['003','005-007','009']
for one in run_case:#one == '003','005-007','009'
if '-' in one:#连续的用例---'005-007'
start,end = one.split('-')#获取对应的数值 '005' '007'--字符串类型
for num in range(int(start),int(end)+1):
run_case_data.append(case_name+f'{num:0>3}')# 5 6 7---Login005
else:#不连续的用例---'005'
run_case_data.append(case_name+f'{one:0>3}')
#-----------------------------------------
print('运行的用例--->',run_case_data)
#3-获取指定数据
row_idx = 0
for one in work_sheet.col_values(0):
if case_name in one and one in run_case_data:# listShoping in listShoping005
# req_body = work_sheet.cell(row_idx,9).value#cell(行编号,列编号)
# resp_data = work_sheet.cell(row_idx, 11).value # cell(行编号,列编号)
col_datas = []#每一行所有获取的列数据
for num in col_indexs:#[4, 9, 11]
tmp = is_josn(work_sheet.cell(row_idx,num).value)# cell(行编号,列编号)
col_datas.append(tmp)
res_list.append(tuple(col_datas))#[(),()]
row_idx += 1#下一行循环
return res_list
#-------自己根据需求写函数-----------------
import json
def is_josn(inStr):# 返回值 : 是 ,不是
try:
return json.loads(inStr) # 没有报错---可以转化为字典 --就json格式
except:
return inStr # 返回需要判断的字符串--不是json字符串
# print(is_josn('{"info":"xingtian"}'))
#--------------------------------------
if __name__ == '__main__':
res = get_excel_data('登录模块','Login',run_case=['003-005','006'])# *[] 解包
print(res)
for one in res:
print(one)