美文网首页软件测试知识想法简友广场
6.Python读取excle(测试用例)

6.Python读取excle(测试用例)

作者: 小小一颗卤蛋 | 来源:发表于2022-11-15 22:33 被阅读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)
    
    

    相关文章

      网友评论

        本文标题:6.Python读取excle(测试用例)

        本文链接:https://www.haomeiwen.com/subject/ugultdtx.html