软件测试知识想法简友广场

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)

上一篇下一篇

猜你喜欢

热点阅读