6.Python讀取excle(測試用例) 版本V1 handle_excelV1.py 版本V2 handle_excelV2.py 版本V3 讀取配置版本

版本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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章