class HttpRequest: mylogger = Log().get_logger() mylogger.info( "------------------------------------------------------------------") mylogger.info("当前运行文件:{}".format(__file__)) def __get(self, url, params=None, **kwargs): return requests.get(url, params=params, **kwargs) def __post(self, url, headers=None, data=None, **kwargs): return requests.post(url, headers=headers, data=data, **kwargs) def send_request(self, url, method, headers, data=None, **kwargs): if method.lower() == "get": self.mylogger.info("运行“get”:{}用例".format(url)) response = self.__get(url=url, params=data, verify=False, **kwargs) response.encoding = 'utf-8' self.mylogger.info("{}运行的结果:{}".format(url, response.text)) return response elif method.lower() == "post": self.mylogger.info("运行“post”:{}用例".format(url)) response = self.__post(url=url, headers=headers, data=data, verify=False, **kwargs) response.encoding = 'utf=8' self.mylogger.info("{}运行的结果:{}".format(url, response.text)) return response
def __init__(self, projectName): PATH = lambda P: os.path.abspath( os.path.join(os.path.dirname(__file__), P)) self.mylogger = Log().get_logger() self.mylogger.info( "------------------------------------------------------------------" ) self.mylogger.info("当前运行文件:{}".format(__file__)) self.mylogger.info("准备获取 {} 项目的用例路径".format(projectName)) self.caseFilePath = PATH("../case/{}.xlsx".format(projectName)) self.mylogger.info("获取到 {} 项目的用例路径:{}".format(projectName, self.caseFilePath)) self.projectName = projectName
def get_project_name(): mylogger = Log().get_logger() mylogger.info( "------------------------------------------------------------------") mylogger.info("当前运行文件:{}".format(__file__)) caseFolder = PATH("../case") # 判断是否存在caseFolder文件夹 if not os.path.exists(caseFolder): mylogger.info("不存在项目") else: for root, dirs, files in os.walk(caseFolder): if not files: mylogger.info("{}文件下的不存在用例文件".format(caseFolder)) break else: mylogger.info("{}文件下的用例文件 {}".format(caseFolder, files)) projectName = [] # 去掉 .xlsx 后缀,添加到projectName中 for name in files: projectName.append(name[:-5]) return projectName
# coding:utf-8 __author__ = 'GRUNMI' import re from common.DataDict import data_dict from common.LogOutput import Log mylogger = Log().get_logger() mylogger.info('当前运行文件:{}'.format(__file__)) def data_replace(data, replace_data, changge_data): replace_value = [] # 需要改变的字段存储在列表中 if replace_data: for i in replace_data.split(","): replace_value.append(i) mylogger.info("动态字段转化成列表:{}".format(replace_value)) # 替换data中的动态值 for value in replace_value: if value in changge_data.keys(): patter = "'{}': '(.*?)'".format(value) or "'{}':'(.*?)'".format( value) be_replace_value_list = re.compile(patter).findall( str(data_dict(data))) # print(be_replace_value_list) # re匹配出来的是一个list for be_replace_value in be_replace_value_list: data = data.replace(be_replace_value, changge_data[value])
def run_case(projectname, type=0, id=None): ''' :type 0代表项目用例,1代表场景用例 :id 用例id :生成用例规则:场景用例需要在报告前加上 settingReport ''' mylogger = Log().get_logger() mylogger.info('当前运行文件:{}'.format(__file__)) mylogger.info('获取{}项目的所有用例'.format(projectname)) project = GetCase(projectname).get_project_case() all_case = project[0] case_file = project[2] case_name = project[3] runResult = [] try: if all_case: wb = openpyxl.load_workbook(case_file) ws = wb.active startTime = time.time() if type == 0: if str(all_case).lower().find('yes') < 0: return 'noRunCase' for case in all_case: if case['Run'].lower() == 'yes': mylogger.info('{}项目的第{}行用例,是否执行为:{}'.format( projectname, case['Sort'], case['Run'])) mylogger.info('准备运行用例') url = case['Protocol'] + case['Host'] + case['Path'] method = case['Method'] headers = case['Headers'] try: result = HttpRequest().send_request( url=url, method=method, headers=headers) # 写入到Response单元格 ws['R' + str(case['RowID'])] = result.text # 获取Response值 Response = result.text except: Response = ws['R' + str(case['RowID'])] = '' # 校验值 # 获取Expect值 Except = case['Expect'] # 获取CheckPoint值 CheckPoint = case['CheckPoint'] # 对比数据 checkResult = data_result_check( Except, CheckPoint, Response) if checkResult[0] == checkResult[1] and Response: testResult = ws['Z' + str(case['RowID'])] = 'true' else: testResult = ws['Z' + str(case['RowID'])] = 'false' reportResult = { "moduleName": case['CaseName'], "path": case['Path'], "result": testResult, "checkDetail": [{ "预期结果": checkResult[0] }, { "运行结果": checkResult[1] }] } runResult.append(reportResult) else: mylogger.info('{}项目的第{}行用例,是否执行为:{},不执行用例'.format( projectname, case['RowID'], case['Run'])) elif type == 1: select_id = [] for i in id.split(','): if i: select_id.append(int(i)) all_id = [] for i in all_case: all_id.append(int(i["ID"])) # 检测选择的用例是否包含在用例中,在选择过程中,用例有可能被删除 if set(select_id) <= set(all_id): # 转换成list,去掉最后一个逗号 for id in select_id: for case in all_case: # excel取出来是一个float类型 if int(id) == int(case['ID']): mylogger.info('{}项目的第{}行用例,是否执行为:{}'.format( projectname, case['Sort'], case['Run'])) mylogger.info('准备运行用例') url = case['Protocol'] + case['Host'] + case[ 'Path'] method = case['Method'] headers = case['Headers'] result = HttpRequest().send_request( url=url, method=method, headers=headers) # 写入到Response单元格 ws['R' + str(case['RowID'])] = result.text # 校验值 # 获取Expect值 Except = case['Expect'] # 获取CheckPoint值 CheckPoint = case['CheckPoint'] # 获取Response值 # Response = ws['R' + str(case['RowID'])] Response = result.text # 对比数据 checkResult = data_result_check( Except, CheckPoint, Response) if checkResult[0] == checkResult[1]: testResult = ws[ 'Z' + str(case['RowID'])] = 'true' else: testResult = ws[ 'Z' + str(case['RowID'])] = 'false' reportResult = { "moduleName": case['CaseName'], "path": case['Path'], "result": testResult, "checkDetail": [{ "预期结果": checkResult[0] }, { "运行结果": checkResult[1] }] } runResult.append(reportResult) else: difference_value = list( set(select_id).difference(set(all_id))) mylogger.info("勾选的ID{},用例表中的ID{},表中不存在勾选的ID:{}".format( select_id, all_id, difference_value)) return 'selectFalse' endTime = time.time() reportFolder = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'report\\', case_name, 'excelReport') if not os.path.exists(reportFolder): os.makedirs(reportFolder) mylogger.info("生成用例目录路径:{}".format(reportFolder)) if type == 0: reportName = time.strftime('%Y-%m-%d %H-%M-%S') + '.xlsx' elif type == 1: reportName = 'settingReport' + time.strftime( '%Y-%m-%d %H-%M-%S') + '.xlsx' reportCaseFile = os.path.join(reportFolder, reportName) wb.save(reportCaseFile) # 在excel中生成图表报告 if type == 0: CreatePie(projectname, type=0).pie() elif type == 1: CreatePie(projectname, type=1).pie() # 生成html图形报告 if type == 0: runNum = get_project_run_num(projectname, type=0) success = runNum[0] failed = runNum[1] sum = success + failed str(success / sum).count('.') == 1 right = str(success / sum).split('.')[1] if len(right) > 2: passRate = str(round(success / sum * 100, 1)) + '%' failedRate = str(round((1 - success / sum) * 100, 1)) + '%' else: passRate = str(int(success / sum * 100)) + '%' failedRate = str(int((1 - success / sum) * 100)) + '%' from platform import python_version pythonVersion = python_version() import django djangoVersion = django.get_version() data = { "projectName": projectname, "testPersonName": "GRUNMI", "startTime": time.strftime('%Y-%m-%d %H:%M:%S'), "runTime": endTime - startTime, "pass": str(success), "failed": str(failed), "sum": sum, "passRate": passRate, "failedRate": failedRate, "runEnvironment": "python%s+django%s" % (pythonVersion, djangoVersion), "runResult": runResult } create_html_report(data, type=0) # get_html_project_report(projectname, type=0) elif type == 1: runNum = get_project_run_num(projectname, type=1) success = runNum[0] failed = runNum[1] sum = runNum[0] + failed str(success / sum).count('.') == 1 right = str(success / sum).split('.')[1] if len(right) > 2: passRate = str(round(success / sum * 100, 1)) + '%' failedRate = str(round((1 - success / sum) * 100, 1)) + '%' else: passRate = str(int(success / sum * 100)) + '%' failedRate = str(int((1 - success / sum) * 100)) + '%' from platform import python_version pythonVersion = python_version() import django djangoVersion = django.get_version() data = { "projectName": projectname, "testPersonName": "GRUNMI", "startTime": time.strftime('%Y-%m-%d %H:%M:%S'), "runTime": endTime - startTime, "pass": str(success), "failed": str(failed), "sum": sum, "passRate": passRate, "failedRate": failedRate, "runEnvironment": "python%s+django%s" % (pythonVersion, djangoVersion), "runResult": runResult } create_html_report(data, type=1) # get_html_project_report(projectname, type=1) return 'success' else:
def case_data(projectName, action, id=1, run='YES', sort=None, sql=None, moduleName='模块名称', caseName='用例名称', caseDescription='用例描述', protocol='http://', host=None, method='GET', headers=None, path=None, data=None, file=None, replaceID=None, expect=None, checkPoint=None, response=None, transmitID=None, transmitTargetID=None, remark=None, createDate=None, updateTime=None, author='GRUNMI', editor='GRUNMI', runResult=None): ''' :param projectName: 项目名称 :param action: 执行动作,1增 2删 3修改用例数据 4修改用例执行状态 5查 :param id: 用例id :param run: 用例执行 :param sort: 用例排序 :param sql: 数据库语法 :param moduleName: 模块名称 :param caseName: 用例名称 :param caseDescription: 用例描述 :param protocol: 协议 :param host: 域名 :param method: 请求方法 :param headers: 请求数据格式 :param path: 请求路径 :param data: 请求数据 :param file: 请求文件 :param replaceID: 替换请求动态数据 :param expect: 预期结果 :param checkPoint: 校验数据 :param response: 实际结果 :param transmitID: 传递的动态id :param transmitTargetID: 传递到目标动态id :param remark: 备注 :param createDate: 创建时间 :param updateTime: 更新时间 :param author: 作者 :param editor: 修改人 :param runResult: 运行状态 :return: ''' mylogger = Log().get_logger() mylogger.info('当前运行文件:{}'.format(__file__)) mylogger.info('调用运行create_project方法') caseFile = create_project(projectName)[1] # print(caseFile) mylogger.info('打开{}文件'.format(caseFile)) action = int(action) id = int(id) # openpyxl操作excel wb = openpyxl.load_workbook(caseFile, data_only=True) # print(wb.get_sheet_names()) # print(wb.sheetnames) # wb.get_sheet_names() 已弃用,需要使用sheetName # xlrd读取excel caseFiles = xlrd.open_workbook(caseFile) caseSheet = caseFiles.sheet_by_index(0) try: for ws in wb.sheetnames: # count:判断是否包含projectName if ws.count(projectName): mylogger.info('已匹配到{}的用例表为:{}'.format(projectName, ws)) # wb.get_sheet_by_name() 已弃用,需要使用wb[] ws = wb[ws] rows = ws.max_row # print(type(rows), '------------------') mylogger.info('获取当前{}表的最大行数:{}'.format(ws, rows)) # 新增 if action == 1: write_row = str(rows + 1) mylogger.info('准备将数据新增在{}表的第{}行'.format(ws, write_row)) # 获取最后一行的id值+1 if rows > 1: ws['A' + write_row] = int(ws['A' + str(rows)].value) + 1 else: ws['A' + write_row] = 1 ws['B' + write_row] = run # 减去用例标题一行 ws['C' + write_row] = int(write_row) - 1 ws['D' + write_row] = sql ws['E' + write_row] = moduleName ws['F' + write_row] = caseName ws['G' + write_row] = caseDescription ws['H' + write_row] = protocol ws['I' + write_row] = host ws['J' + write_row] = method ws['K' + write_row] = headers ws['L' + write_row] = path ws['M' + write_row] = data ws['N' + write_row] = file ws['O' + write_row] = replaceID ws['P' + write_row] = expect ws['Q' + write_row] = checkPoint # ws['R' + write_row] = response ws['S' + write_row] = transmitID ws['T' + write_row] = transmitTargetID # ws['U' + write_row] = remark ws['V' + write_row] = str( time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))) ws['W' + write_row] = str( time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))) ws['X' + write_row] = author ws['Y' + write_row] = editor # ws['Z' + write_row] = runResult mylogger.info('新增在{}表中第{}行的数据成功'.format(ws, write_row)) mylogger.info('总共有{}条用例数据'.format(int(write_row) - 1)) # 删除 elif action == 2: mylogger.info('准备删除{}表中,id为{}的用例数据'.format(ws, id)) if rows > 1: try: for id_col, id_title in enumerate( caseSheet.row_values(0)): # 用例的标题 if id_title == 'ID': print(caseSheet.col_values(id_col)) for id_row, id_val in enumerate( caseSheet.col_values(id_col)[1::]): if int(id_val) == id: # 修改sort数据 # mylogger.info('准备更新{}表中,sort数据'.format(ws)) for sort_col, sort_title in enumerate( caseSheet.row_values(0)): if sort_title == 'Sort': # 需要删除的id的sort值 id_sort_value = ws.cell( row=id_row + 2, column=sort_col + 1).value for sort_row, sort_val in enumerate( caseSheet. col_values(sort_col )[1::]): if int(sort_val) > int( id_sort_value): val = ws.cell( row=int( sort_row) + 2, column=int( sort_col) + 1).value mylogger.info( '{}表中,修改{}大于{}的sort数据成功' .format( ws, val, id_sort_value )) val -= 1 ws.cell( row=int( sort_row) + 2, column=int( sort_col) + 1, value=val) break # 删除数据 mylogger.info( '删除{}表中,id为{}的用例数据成功'.format( ws, id)) ws.delete_rows(id_row + 2) mylogger.info( '删除{}表中,第{}条用例数据'.format( ws, id_row + 1)) break # mylogger.info('{}表中,删除用例数据不成功,id为{}的用例数据不存在'.format(ws, id)) break except Exception as e: mylogger.info('删除{}表中,id为{}的用例报错:{}'.format( ws, id, e)) elif rows == 1: mylogger.info('{}表中不存在用例数据,删除用例数据不成功'.format(ws)) mylogger.info('总共有{}条用例数据'.format(int(rows) - 1)) # 修改用例数据 elif action == 3: mylogger.info('准备修改{}表中,id为{}的用例数据'.format(ws, id)) if rows > 1: for id_col, id_title in enumerate( caseSheet.row_values(0)): if id_title == 'ID': for id_row, id_val in enumerate( caseSheet.col_values(id_col)[1::]): if int(id_val) == id: write_row = str(id_row + 2) # 获取最后一行的id值+1 # ws['A' + write_row] = int(ws['A' + write_row].value) + 1 # ws['B' + write_row] = run # 减去用例标题一行 # ws['C' + write_row] = int(write_row) - 1 ws['D' + write_row] = sql ws['E' + write_row] = moduleName ws['F' + write_row] = caseName ws['G' + write_row] = caseDescription ws['H' + write_row] = protocol ws['I' + write_row] = host ws['J' + write_row] = method ws['K' + write_row] = headers ws['L' + write_row] = path ws['M' + write_row] = data ws['N' + write_row] = file ws['O' + write_row] = replaceID ws['P' + write_row] = expect ws['Q' + write_row] = checkPoint # ws['R' + write_row] = response ws['S' + write_row] = transmitID ws['T' + write_row] = transmitTargetID # ws['U' + write_row] = remark # ws['V' + write_row] = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))) ws['W' + write_row] = str( time.strftime( '%Y%m%d%H%M%S', time.localtime(time.time()))) ws['X' + write_row] = author ws['Y' + write_row] = editor # ws['Z' + write_row] = runResult mylogger.info( '修改{}表中,id为{}的用例数据成功'.format( ws, id)) break # mylogger.info('修改{}表中,id为{}的用例数据不存在,修改失败'.format(ws, id)) # mylogger.info('修改{}表中,不存在标题为ID的'.format(ws)) else: mylogger.info('{}表中不存在用例数据,删除用例数据不成功'.format(ws)) # 修改是否执行用例 elif action == 4: mylogger.info('准备修改{}表中,id为{}的用例执行状态为:{}'.format( ws, id, run)) if rows > 1: for id_col, id_title in enumerate( caseSheet.row_values(0)): if id_title == 'ID': for id_row, id_val in enumerate( caseSheet.col_values(id_col)[1::]): if int(id_val) == id: write_row = str(id_row + 2) if ws['B' + write_row].value == run: mylogger.info( '修改{}表中,id为{}的用例执行状态数据未做改变,不需要更新' .format(ws, id)) break else: ws['B' + write_row] = run mylogger.info( '修改{}表中,id为{}的用例执行状态数据更新成功'. format(ws, id)) break # mylogger.info('修改{}表中,id为{}的用例数据不存在,更新失败'.format(ws, id)) break # mylogger.info('修改{}表中,不存在标题为ID的'.format(ws)) else: mylogger.info('{}表中不存在用例数据,删除用例数据不成功'.format(ws)) # 查询 elif action == 5: mylogger.info('准备查询{}表中,id为{}的用例数据'.format(ws, id)) if rows > 1: for id_col, id_title in enumerate( caseSheet.row_values(0)): if id_title == 'ID': for id_row, id_val in enumerate( caseSheet.col_values(id_col)[1::]): if int(id_val) == id: find_row = str(id_row + 2) ID = ws['A' + find_row].value Run = ws['B' + find_row].value Sort = ws['C' + find_row].value Sql = ws['D' + find_row].value ModuleName = ws['E' + find_row].value CaseName = ws['F' + find_row].value CaseDescription = ws['G' + find_row].value Protocol = ws['H' + find_row].value Host = ws['I' + find_row].value Method = ws['J' + find_row].value Headers = ws['K' + find_row].value Path = ws['L' + find_row].value Data = ws['M' + find_row].value Files = ws['N' + find_row].value ReplaceID = ws['O' + find_row].value Expect = ws['P' + find_row].value CheckPoint = ws['Q' + find_row].value Response = ws['R' + find_row].value TransmitID = ws['S' + find_row].value TransmitTargetID = ws['T' + find_row].value Remark = ws['U' + find_row].value CreateDate = ws['V' + find_row].value UpdateTime = ws['W' + find_row].value Author = ws['X' + find_row].value Editor = ws['Y' + find_row].value RunResult = ws['Z' + find_row].value find_result = { 'projectname': projectName, 'id': ID, 'run': Run, 'sort': Sort, 'sql': Sql, 'moduleName': ModuleName, 'caseName': CaseName, 'caseDescription': CaseDescription, 'protocol': Protocol, 'host': Host, 'method': Method, 'headers': Headers, 'path': Path, 'data': Data, 'files': Files, 'replaceID': ReplaceID, 'expect': Expect, 'checkPoint': CheckPoint, 'result': Response, 'transmitID': TransmitID, 'transmitTargetID': TransmitTargetID, 'remark': Remark, 'createDate': CreateDate, 'updateTime': UpdateTime, 'author': Author, 'editor': Editor, 'runResult': RunResult, } mylogger.info( '查询{}表中,id为{}的用例数据成功:{}'.format( ws, id, find_result)) wb.close() mylogger.info( '关闭{}工作簿成功'.format(projectName)) return find_result mylogger.info('查询{}表中,id为{}的用例数据不存在'.format( ws, id)) return 'noFind' else: mylogger.info('{}表中,不存在用例数据'.format(ws)) mylogger.info('准备保存{}表'.format(ws)) wb.save(caseFile) mylogger.info('保存{}表成功,准备关闭{}工作簿'.format(ws, projectName)) break except Exception as e: mylogger.info('不可预知的错误:{}'.format(e)) wb.close() mylogger.info('关闭{}工作簿成功'.format(projectName))
def create_project(projectName): mylogger = Log().get_logger() mylogger.info( "------------------------------------------------------------------") mylogger.info("当前运行文件:{}".format(__file__)) caseFolder = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '\\case\\') # print(caseFolder) caseFile = os.path.join(caseFolder, projectName + '.xlsx') # 判断是否存在case目录,没有,则创建 if not os.path.exists(caseFolder): os.mkdir(caseFolder) mylogger.info("生成用例目录路径:{}".format(caseFolder)) # 判断是否存在case模板,没有,则创建 if not os.path.exists(caseFile): wb = openpyxl.Workbook(caseFile) wb.create_sheet(title=projectName + 'InterfaceData') mylogger.info("生成用例文件路径:{}".format(caseFile)) wb.save(caseFile) wb = openpyxl.load_workbook(caseFile, data_only=True) ws = wb.active mylogger.info("创建用例标题") ws['A1'] = 'ID' ws['B1'] = 'Run' ws['C1'] = 'Sort' ws['D1'] = 'Sql' ws['E1'] = 'ModuleName' ws['F1'] = 'CaseName' ws['G1'] = 'CaseDescription' ws['H1'] = 'Protocol' ws['I1'] = 'Host' ws['J1'] = 'Method' ws['K1'] = 'Headers' ws['L1'] = 'Path' ws['M1'] = 'Data' ws['N1'] = 'Files' ws['O1'] = 'ReplaceID' ws['P1'] = 'Expect' ws['Q1'] = 'CheckPoint' ws['R1'] = 'Response' ws['S1'] = 'TransmitID' ws['T1'] = 'TransmitTargetID' ws['U1'] = 'Remark' ws['V1'] = 'CreateDate' ws['W1'] = 'UpdateTime' ws['X1'] = 'Author' ws['Y1'] = 'Editor' ws['Z1'] = 'RunResult' # print(ws.rows) # print(ws[1]) mylogger.info("修改用例标题样式:宋体加粗") for cell in ws[1]: cell.font = Font('宋体', bold=True) # a1 = ws['A1'] # a1.font = Font('黑体', bold=True) wb.save(caseFile) mylogger.info("保存创建的用例文件,路径为:{}".format(caseFile)) wb.close() return 'createSuccess', caseFile else: mylogger.info('已存在{}用例文件:{}'.format(projectName, caseFile)) return 'alreadyExist', caseFile