接口测试 接口测试中参数化, 读取 excel 用例的实现,高可用

kirin · 2021年06月13日 · 1472 次阅读
import pprint

import xlrd
'''
v1.0
# 1- 加载表格到内存open_workbook()传入文件路径与保持原样式
# 2- excel实例调用sheet_by_name()传入一个工作表的名字,返回这个工作表实例
# 3- 读取工作表中单元格数据,列数据,行数据
    col_values()列数据,row_values(0) 行数据,cell_value(0,0)单元格数据
# 4- 取值的列为:请求参数与相应预期结果这两列,列不变行要变

v2.0
功能描述:
    1- 可以用户选择任何列数据
        1- 列编号
        2- 列名---更适合
    2- 分类筛选执行 
        1- 全部执行 -all
        2- 分段执行 tc003-tc007
        3- 随机执行 tc001,tc009
        4- 复合场景 [tc001,tc003-tc007,tc009]
'''
'''
1- 得到需要操作的工作表
    1- open_workbook方法加载excel文件,返回文件对象
    2- sheet_by_name()根据名字获取excel工作表中的,返回工作表对象
2- 处理用户传入的列名,把列名转为列的下标,样式:元祖('用例编号','请求参数','响应预期结果')
    1- 循环元祖,取出列名
    2- row_values(0)取出第0行数据返回一个列表,使用index()把元祖取到的列名放入返回下标
    3- 把每次得到的下标放入列表,到此用户要的列全部得到
3- 处理用户传入的行的取值范围,是一个列表['003-006','all','007']分段取,全部取,单个取,默认全取
    1- (全取)判断用户取值的列表里是否包含 'all'如果有直接全取(此时数据里有一些脏数据,是我们不需要的,后面会筛选掉)
        [用例编号,Login003,Login004,Login005,Login006]
    2- (不全取)包括单个取,分段取
        1- 循环取出用户的传入的,行的取值范围列表(得到结果为'001' '003-006')
            1- 判断值是否包含'-',包含就是分段取值,
                1- 使用split()传入'-'切割字符串得到一个列表['003','006']得到了分段取得起始值与终止值
                2- 把003,006转为int,放入循环range,003作为起始值,006作为终止值,不包含终止值,006需要加1
                    一次得到的值为:3,4,5,6
                2- 格式化每次得到的值:列:Login003,Login部分是变化的,就用CaseName参数替代
                    格式为:f'{CaseName}{i:>03}',把拼接好的值放入列表最后为:[Login003,Login004,Login005,Login006]
            2- 不包含为单个取值'001'
                1- 直接拼接:CaseName+oneCase
4- 把得到的列表中,用例编号转为行下标,并筛除脏数据
        1- 循环用例编号列表,得到用例编号
        2- 判断用例编号中是否包含CaseName,
        3- 取第0列全部数据, 返回一个列表,用index()把用例编号传入得到下标 ,把下标加入列表,

到此行下标,列下标都有了

5- 用得到的行下标列表,列下标列表,获取用户需要的值
    1- 行作为外循环,列作为内循环,(把每行n列的值取完,跳出一次内循环,开始取下一行的n列,依次这样,直到行列表
        的值取完,n多少取决于列的列表有多少元素)
    2- cell_value(index,i),index为行,i为列,把每次内循环的值加入列表,列表每次内层循环完要清空,需要定义在内外循环之间
    3- 接口fixture需要的数据为:[[参数1,参数2],[参数1,参数2]],需要把每次内循环中列表放入另一个列表.套起来
    4- 最后返回外层列表即可

'''
def get_excel_data(fileDir,sheet_name,CaseName,*ColName,screen=['all']):
    '''

    :param fileDir: excel文件地址
    :param sheet_name: sheet工作表的名字
    :param CaseName: 用例的名字
    :param ColName: 列的名字,支持读取多列
    :param screen: 筛选要执行的用例支持默认全部,支持分段与单个
    :return: 返回[[数据1,数据2],[数据1,数据2]]这种格式
    '''

    SheetCell_lists = []#返回列表,数据格式:[[参数1,参数2],[参数1,参数2]]

    #加载
    workbook = xlrd.open_workbook(filename=fileDir,formatting_info=True)
    worksheet = workbook.sheet_by_name(sheet_name=sheet_name)#根据名字拿到工作表


    SheetCol_list = []  # 列号列表
    # ColName是可变长度参数,为用户要取得列的名称:('列名1','列名2')
    for one in ColName:
        # row_values,取第0行每列的名字,返回列表,index 传入列名,返回下标存入列表,作为单元格取值的列值
        CaseIndex = worksheet.row_values(0).index(one)
        SheetCol_list.append(CaseIndex)#获取放入列表列号
    screen_list = []#存放用户要取得用例编号的名字

    # 判断用户取全部用例
    if  'all' in screen:
        #取全部用例,拿出第0列全部数据,放入列表,
        screen_list = worksheet.col_values(0)
    else:
        #循环用户需要取得用例参数screen格式为:[001-003,006]
        for oneCase in screen:
            # 判断是否是001-003这种分段的
            if '-' in oneCase:
                #用-切割字符串,得到起始用例值与终止用例值
                case = oneCase.split('-')
                # 循环得到用户分段用例中间的值,格式为 3,4,5
                for i in range(int(case[0]),int(case[1])+1):
                    #与用户CaseName拼接放入列表,格式为:[Login003,Login004,Login005]
                    screen_list.append(f'{CaseName}{i:>03}')
            # 否则就是单个的
            else:
                # 把CaseName+oneCase拼接
                screen_list.append(CaseName+oneCase)

    screen_lists = []#行号列表
    for one in screen_list:#循环的到的用户要取得case,
        if CaseName in one:
            # 用户要取得用例编号的名字,转为下标
            screen_lists.append(worksheet.col_values(0).index(one))# 拿到case的下标

    #循环用户筛选的case下标列表,就是case的行号,传入cell_value(index,i)
    for index in screen_lists:#行号
            SheetCell_list = [] # 定义在这里因为每次进入内循环要清空列表
            for i in SheetCol_list:#列号
                SheetCell = worksheet.cell_value(index,i)# 请求参数
                # SheetCell2 = worksheet.cell_value(index, i)#相应参数
                SheetCell_list.append(SheetCell)
            SheetCell_lists.append(SheetCell_list)#返回数据格式:[[参数1,参数2],[参数1,参数2]]
    return SheetCell_lists



if __name__ == '__main__':
    work = get_excel_data('../data/testCaseFile_V1.5.xls','登录模块','Login',
                          '用例编号','请求参数','响应预期结果',screen=['001-003'])
    pprint.pp(work)
    print(work)
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册