Read excel test cases: assemble test data through multiple sheets to solve the problem of multi-layer nesting of parameters

By reading excel sheet1

1. Sample interface parameters:

{
    "referenceList": [{
        "isTrusted": true,
        "keyList": [],
        "sexTypeChecked": true,
        "ageChecked": false,
        "samptypeChecked": false,
        "sexCode": "1",
        "referenceLow": "22",
        "referenceHigh": "222",
        "referenceShow": "22--222",
        "crisesHigh": "2222",
        "crisesLow": "2",
        "onlyIndex": 1
    }],
    "isFormula": false,
    "sexTypeChecked": true,
    "ageChecked": false,
    "samptypeChecked": false,
    "businessType": "1",
    "projectCode": "bm10001",
    "projectName": "名称",
    "inputCode": "MC",
    "referenceLow": "11",
    "referenceHigh": "111",
    "referenceShow": "11--111",
    "crisesLow": "1",
    "crisesHigh": "1111",
    "wordResults": [{
        "status": "1",
        "wordDescrips": [],
        "crisesFlag": "2",
        "resultStatus": "2",
        "recheckFlag": "2",
        "wordDescription": "描述",
        "resultStatusValue": "2",
        "crisesFlagValue": "2",
        "recheckFlagValue": "2",
        "onlyIndex": 1
    }],
    "orgId": 54,
    "referenceSelected": "性别",
    "referenceValueVos": [{
        "isTrusted": true,
        "keyList": [],
        "sexTypeChecked": true,
        "ageChecked": false,
        "samptypeChecked": false,
        "sexCode": "1",
        "referenceLow": "22",
        "referenceHigh": "222",
        "referenceShow": "22--222",
        "crisesHigh": "2222",
        "crisesLow": "2",
        "onlyIndex": 1
    }]
}

2. Test case design;

Examples:

1. In the first layer: referenceList, wordResults, referenceValueVos have nested parameters, the data is stored in the sheet with the same name, path[2,4] represents rows 3 and 4 of the sheet with the same name

2. The data to be assembled for the first nested parameter referenceList

Three, realize

# -*- coding: gbk -*-
import re
import xlrd


class ReadReqParams():
    """读测试用例文件"""
    def __init__(self, data):
        # self.file_path = file_path
        self.data = data

    def __tablecells(self, table):
        for item in table.merged_cells:  # 合并单元格坐标
            return item

    def __sheet_others(self, sheetname, beginrows, endrows):
        """
        获取sheet中从m行到n行的数据
        :param sheetname: sheet名称
        :param beginrows: 起始行m
        :param endrows: 结尾行n
        :return:
        """
        table = self.data.sheet_by_name(sheetname)
        keys = table.row_values(0)
        colnum = table.ncols
        sheet_others_lists = []
        for i in range(int(beginrows), int(endrows)):
            data_dict = {}
            values = table.row_values(i)
            for x in range(colnum):
                data_dict[keys[x]] = values[x]
            sheet_others_lists.append(data_dict)
        return sheet_others_lists

    def __sheet1(self, table):
        """
        获取sheet1的数据
        :param table:
        :return:
        """
        row1_values = table.row_values(0)
        rownum = table.nrows
        colnum = table.ncols
        if rownum <= 1:
            print('Can not find TestCase')
        else:
            file_lists = []
            for i in range(2, rownum):
                data_dict = {}
                rowvalues = table.row_values(i)
                for x in range(colnum):
                    data_dict[row1_values[x]] = rowvalues[x]
                file_lists.append(data_dict)
            return file_lists

    def __update_sheet(self, table, sheet_names):
        """
        将sheet1中有路径坐标的path[m,n]单元格,使用对应sheet中m,n行数据替换
        :param table:
        :param sheet_names:
        :return:
        """
        file_lists = self.__sheet1(table)
        params_lists = []
        for data_dict in file_lists:
            for sheet_name in sheet_names:
                if sheet_name in data_dict.keys():
                    position = re.findall('\d', data_dict[sheet_name])  # 匹配入参嵌套对象坐标
                    sheet_others_lists = self.__sheet_others(sheet_name, position[0], position[1])
                    data_dict[sheet_name] = sheet_others_lists
            params_lists.append(data_dict)
        return params_lists
    
    def read_excel_more_sheets(self):
        """
        获取测试数据
        :return:
        """
        # 获取所有sheet名字
        sheet_names = self.data.sheet_names()
        # 打开sheet1
        table = self.data.sheet_by_index(0)
        params_lists = self.__update_sheet(table, sheet_names)
        return params_lists
    def read_excel_file(self):
        """
        读excle文件
        """
        table = self.data.sheet_by_index(0)
        keys = table.row_values(0)
        rownum = table.nrows
        colnum = table.ncols
        if rownum <= 1:
            print('Can not find TestCase')
        else:
            file_list = []
            for i in range(2, rownum):
                data_list = {}
                values = table.row_values(i)
                for x in range(colnum):
                    data_list[keys[x]] = values[x]
                file_list.append(data_list)
            return file_list
def judge_isvalid(file_path_testcase):
    """调用读配置文件"""
    try:
        data = xlrd.open_workbook(file_path_testcase)
    except FileNotFoundError:
        find_testcase_error = 'Can Not Find TestCase'
        return find_testcase_error
    except xlrd.biffh.XLRDError:
        open_testcase_error = 'Can Not Open TestCase'
        return open_testcase_error
    else:
        sheet_names = data.sheet_names()
        # 无嵌套请求参数类型
        if len(sheet_names) == 1:
            test_cases = ReadReqParams(data).read_excel_file()
        # 有嵌套请求参数类型
        elif len(sheet_names) > 1:
            test_cases = ReadReqParams(data).read_excel_more_sheets()
        else:
            test_cases = 'No Sheet'
        return test_cases
file_path_testcase = ''
test_cases = judge_isvalid(file_path_testcase) # 测试用例集

Guess you like

Origin blog.csdn.net/kk_gods/article/details/109180530