# -*-coding:utf-8 -*- # # --------------------------------------------------------------------------- # ProjectName: test63 # FileName: read_excel.py # Author: lao_zhao # Datetime: 2024/11/5 14:34 # Description: # # --------------------------------------------------------------------------- import openpyxl from APIAutoTest_v3_1 import log, logor from APIAutoTest_v3_1.common.read_basic_ini import ReadBasicIni from APIAutoTest_v3_1.common.read_user_ini import ReadUserIni from APIAutoTest_v3_1.common.read_json import read_json from APIAutoTest_v3_1.data_config.settings import * class ReadExcel: @logor def __init__(self, user): """读取所有的json文件,获取excel的工作簿和工作表""" # 读取指定用户的ini文件 ini = ReadUserIni(user) # 获取指定用户的存放数据的json文件路径 case_data_path = ini.get_file_path(CASE_NAME) expect_data_path = ini.get_file_path(EXPECT_NAME) sql_data_path = ini.get_file_path(SQL_NAME) self.case_data_dict = read_json(case_data_path) self.expect_data_dict = read_json(expect_data_path) self.sql_data_dict = read_json(sql_data_path) # 获取指定用户的excel文件路径 excel_path = ini.get_file_path(EXCEL_NAME) # 获取指定用户的工作表名称 table_name = ini.get_table_name(TABLE_NAME) try: wb = openpyxl.load_workbook(excel_path) self.ws = wb[table_name] except Exception as e: # log.error(f"获取excel的工作簿或工作表出错,excel的路径为:{excel_path},工作表名称为:{table_name},错误的类型为:{type(e)}, 错误的描述为:{e}") raise e @logor def __get_cell_value(self, column: str, row: int) -> str: """获取指定单元格数据""" # log.info(f"执行的方法为:__get_cell_value,功能描述为:获取指定单元格数据,传入的参数为:{column}列,{row}行") try: cell_value = self.ws[column+str(row)].value except Exception as e: # log.error(f"执行的方法为:__get_cell_value,功能描述为:获取指定单元格数据,传入的参数为:{column}列,{row}行, 报错,错误类型为:{type(e)}, 错误的描述为:{e}") raise e else: if cell_value is None: return None elif cell_value.strip(): return cell_value.strip() @logor def module_name(self, row): """根据行号,获取模块名称""" # log.info(f"执行的方法为:module_name,功能描述为:根据行号,获取模块名称,传入的参数为:{row}行") return self.__get_cell_value(MODULE, row) @logor def api_name(self, row): """根据行号,获取接口名称""" # log.info(f"执行的方法为:api_name,功能描述为:根据行号,获取接口名称,传入的参数为:{row}行") return self.__get_cell_value(API, row) @logor def req_method(self, row): """根据行号,获取用例的请求方法""" # log.info(f"执行的方法为:req_method,功能描述为:根据行号,获取用例的请求方法,传入的参数为:{row}行") return self.__get_cell_value(METHOD, row) @logor def req_url(self, row): """根据行号,获取用例的请求url""" # log.info(f"执行的方法为:req_url,功能描述为:根据行号,获取用例的请求url,传入的参数为:{row}行") path = self.__get_cell_value(PATH, row) if path: # 创建ReadBasicIni类对象,调用get_host获取被测系统的域名,在和接口路径拼接完整的url return ReadBasicIni().get_host(HOST_NAME) + path @logor def req_mime(self, row): """根据行号,获取用例的请求媒体类型""" # log.info(f"执行的方法为:req_mime,功能描述为:根据行号,获取用例的请求媒体类型,传入的参数为:{row}行") mime = self.__get_cell_value(MIME, row) if mime: return mime.lower() @logor def case_data(self, row): """根据行号,获取用例数据""" # log.info(f"执行的方法为:case_data,功能描述为:根据行号,获取用例数据,传入的参数为:{row}行") case_data_key = self.__get_cell_value(CASE, row) module_name = self.module_name(row) api_name = self.api_name(row) if case_data_key and module_name and api_name: return self.case_data_dict[module_name][api_name][case_data_key] @logor def expect_data(self, row): """根据行号,获取期望数据""" # log.info(f"执行的方法为:expect_data,功能描述为:根据行号,获取期望数据,传入的参数为:{row}行") expect_data_key = self.__get_cell_value(EXPECT, row) module_name = self.module_name(row) api_name = self.api_name(row) if expect_data_key and module_name and api_name: return self.expect_data_dict[module_name][api_name][expect_data_key] @logor def sql_type(self, row): """根据行号,获取sql语句类型""" # log.info(f"执行的方法为:sql_type,功能描述为:根据行号,获取sql语句类型,传入的参数为:{row}行") value = self.__get_cell_value(SQLTYPE, row) if value: return value.lower() @logor def sql_data(self, row): """根据行号,获取sql语句""" # log.info(f"执行的方法为:sql_data,功能描述为:根据行号,获取sql语句,传入的参数为:{row}行") sql_data_key = self.__get_cell_value(SQL, row) module_name = self.module_name(row) api_name = self.api_name(row) if sql_data_key and module_name and api_name: return self.sql_data_dict[module_name][api_name][sql_data_key] @logor def update_key(self, row): """根据行号,获取用例的更新的key""" # log.info(f"执行的方法为:update_key,功能描述为:根据行号,获取用例的更新的key,传入的参数为:{row}行") return self.__get_cell_value(UPDATEKEY, row) @logor def case_title(self, row): """根据行,获取用例的标题""" return self.__get_cell_value(TITLE, row) @logor def case_level(self, row): """根据行获取用例的等级""" return self.__get_cell_value(LEVEL, row) @logor def get_data(self): """将测试使用到的数据存放在二维列表中""" list_data = [] for row in range(2, self.ws.max_row+1): module = self.module_name(row) api = self.api_name(row) title = self.case_title(row) level = self.case_level(row) method = self.req_method(row) url = self.req_url(row) mime = self.req_mime(row) case_data = self.case_data(row) expect_data = self.expect_data(row) sql_type = self.sql_type(row) sql_data = self.sql_data(row) update_key = self.update_key(row) if method and url and expect_data: list_data.append([module, api, title, level, method, url, mime, case_data, expect_data, sql_type, sql_data, update_key]) else: return list_data if __name__ == '__main__': excel = ReadExcel("zs_data") print(excel.get_data())