版本V1
需求場景:寫一個讀取excle的文件代碼
需求分析:
1.需要獲取的數據:請求數據,預期的響應體
2.需要返回什麼樣數據類型
使用場景:這個數據給自動化測試框架使用pytest做ddt: [(請求體1,響應數據1),(請求體2,預期響應數據2)]
代碼方案:
1、打開這個excle
2、讀取響應列數據
3、組裝結果數據
excle 表如下所示:
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)