def post(self, request, apiAdr=None): url = "/"+apiAdr try: obj = ApiInfo.objects.get(apiAddress=url, mockStatus=True) except ObjectDoesNotExist: return JsonResponse(code="999984", data="未匹配到mock地址或未开启!") head_data = ApiHead.objects.filter(api=obj) if len(head_data): for i in head_data: head = i.name.upper().replace("-", "_") try: if head == "CONTENT_TYPE": if request.environ[head] != i.value: return Response(status=400) else: if request.environ["HTTP_"+head] != i.value: return Response(status=400) except KeyError: return Response(status=400) if obj.requestParameterType == "form-data": param = ApiParameter.objects.filter(api=obj) if len(param): for j in param: if j.required: if request.POST.get(j.name) is None: return Response(status=400) else: param = ApiParameterRaw.objects.filter(api=obj) if len(param): data = JSONParser().parse(request) result = check_json(data, json.loads(param[0].data)) if result == "fail": return Response(status=400) return Response(json.loads(obj.data), status=obj.mockCode)
def test_api(host_id, case_id, project_id, _id): """ 执行接口测试 :param host_id: 测试的host域名 :param case_id: 测试用例ID :param _id: 用例下接口ID :param project_id: 所属项目 :return: """ host = GlobalHost.objects.get(id=host_id, project=project_id) data = AutomationCaseApiSerializer( AutomationCaseApi.objects.get(id=_id, automationTestCase=case_id)).data http_type = data['httpType'] request_type = data['requestType'] address = host.host + data['apiAddress'] head = json.loads( serializers.serialize( 'json', AutomationHead.objects.filter(automationCaseApi=_id))) header = {} request_parameter_type = data['requestParameterType'] examine_type = data['examineType'] http_code = data['httpCode'] response_parameter_list = data['responseData'] if http_type == 'HTTP': url = 'http://' + address else: url = 'https://' + address if data['requestParameterType'] == 'form-data': parameter_list = json.loads( serializers.serialize( 'json', AutomationParameter.objects.filter(automationCaseApi=_id))) parameter = {} for i in parameter_list: key_ = i['fields']['name'] value = i['fields']['value'] try: if i['fields']['interrelate']: interrelate_type = re.findall('(?<=<response\[).*?(?=\])', value) if interrelate_type[0] == "JSON": api_id = re.findall('(?<=<response\[JSON]\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) try: param_data = eval( json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automationCaseApi=api_id[0])))[0] ['fields']["responseData"]) for j in a: param_data = param_data[j] except Exception as e: logging.exception(e) record_results( _id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="") return 'fail' elif interrelate_type[0] == "Regular": api_id = re.findall( '(?<=<response\[Regular]\[).*?(?=\])', value) pattern = re.findall('(?<=\[").*?(?="])', value) param_data = json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automationCaseApi=api_id[0])) )[-1]['fields']["responseData"] param_data = re.findall(pattern[0], param_data.replace("\'", "\""))[0] else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="") return 'fail' pattern = re.compile(r'<response\[.*]') parameter[key_] = re.sub(pattern, str(param_data), value) else: parameter[key_] = value except KeyError as e: logging.exception(e) record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="关联有误!") return 'fail' if data["formatRaw"]: request_parameter_type = "raw" else: parameter = AutomationParameterRawSerializer( AutomationParameterRaw.objects.filter(automationCaseApi=_id), many=True).data if len(parameter): if len(parameter[0]["data"]): try: parameter = eval(parameter[0]["data"]) except Exception as e: logging.exception(e) record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="") return 'fail' else: parameter = {} else: parameter = {} for i in head: key_ = i['fields']['name'] value = i['fields']['value'] if i['fields']['interrelate']: try: interrelate_type = re.findall('(?<=<response\[).*?(?=\])', value) if interrelate_type[0] == "JSON": api_id = re.findall('(?<=<response\[JSON]\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) try: param_data = eval( json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automationCaseApi=api_id[0])))[-1] ['fields']["responseData"]) for j in a: param_data = param_data[j] except Exception as e: logging.exception(e) record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="关联有误!") return 'fail' elif interrelate_type[0] == "Regular": api_id = re.findall('(?<=<response\[Regular]\[).*?(?=\])', value) pattern = re.findall('(?<=\[").*?(?="])', value) param_data = json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automationCaseApi=api_id[0])) )[0]['fields']["responseData"] param_data = re.findall(pattern[0], param_data.replace("\'", "\""))[0] else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="") return 'fail' pattern = re.compile(r'<response\[.*]') header[key_] = re.sub(pattern, str(param_data), value) except Exception as e: logging.exception(e) record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='ERROR', code="", response_data="关联有误!") return 'fail' else: header[key_] = value header["Content-Length"] = '%s' % len(str(parameter)) try: if request_type == 'GET': code, response_data = get(header, url, request_parameter_type, parameter) elif request_type == 'POST': code, response_data = post(header, url, request_parameter_type, parameter) elif request_type == 'PUT': code, response_data = put(header, url, request_parameter_type, parameter) elif request_type == 'DELETE': code, response_data = delete(header, url, request_parameter_type, parameter) else: return 'ERROR' except ReadTimeout: logging.exception(ReadTimeout) record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='TimeOut', code="408", response_data="") return 'timeout' if examine_type == 'no_check': record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='PASS', code=code, response_data=response_data) return 'success' elif examine_type == 'json': if int(http_code) == code: if not response_parameter_list: response_parameter_list = "{}" try: logging.info(response_parameter_list) logging.info(response_data) result = check_json(json.loads(response_parameter_list), response_data) except Exception: logging.info(response_parameter_list) result = check_json( eval( response_parameter_list.replace('true', 'True').replace( 'false', 'False')), response_data) if result: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="JSON校验", examine_data=response_parameter_list, host=host.name, _result='PASS', code=code, response_data=response_data) else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="JSON校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return result else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="JSON校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' elif examine_type == 'only_check_status': if int(http_code) == code: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="校验HTTP状态", examine_data=response_parameter_list, host=host.name, _result='PASS', code=code, response_data=response_data) return 'success' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="校验HTTP状态", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' elif examine_type == 'entirely_check': if int(http_code) == code: try: result = operator.eq(json.loads(response_parameter_list), response_data) except Exception as e: logging.exception(e) result = operator.eq( eval( response_parameter_list.replace('true', 'True').replace( 'false', 'False')), response_data) if result: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="完全校验", examine_data=response_parameter_list, host=host.name, _result='PASS', code=code, response_data=response_data) return 'success' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="完全校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="完全校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' elif examine_type == 'Regular_check': if int(http_code) == code: try: logging.info(response_parameter_list) result = re.findall(response_parameter_list, json.dumps(response_data)) logging.info(result) except Exception as e: logging.exception(e) return "fail" if result: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="正则校验", examine_data=response_parameter_list, host=host.name, _result='PASS', code=code, response_data=response_data) return 'success' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="正则校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type="正则校验", examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail' else: record_results(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, host=host.name, _result='FAIL', code=code, response_data=response_data) return 'fail'
def test_api(host_id, case_id, project_id, _id): """ 执行接口测试 :param host_id: :param case_id: :param project_id: :param _id: :return: """ host = GlobalHost.objects.get(id=host_id, project=project_id) data = AutomationCaseApiSerializer( AutomationCaseApi.objects.get(id=_id, automation_test_case=case_id)).data http_type = data['http_type'] request_type = data['request_type'] address = host.host + data['api_address'] head = json.loads( serializers.serialize( 'json', AutomationHead.objects.filter(automation_case_api=_id))) header = {} request_parameter_type = data['request_parameter_type'] examine_type = data['examine_type'] http_code = data['http_code'] response_parameter_list = data['response_data'] url = 'http://' + address if http_type == "HTTP" else 'https://' + address if request_parameter_type == 'form-data': para_list = AutomationParameterSerializer( AutomationParameter.objects.filter(automation_case_api=_id), many=True).data parameter = {} for param in para_list: key = param['name'] value = param['value'] try: if param['interrelate']: # 匹配<response>[]中间的数据 interrelate_type = re.findall('(?<=<response\[).*?(?=\])', value) if interrelate_type[0] == "JSON": api_id = re.findall( '(?<=<response\[JSON\]\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) try: param_data = eval( json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automation_case_api=api_id[0])))[0] ['fields']['response_data']) for j in a: param_data = param_data[j] except Exception as e: logging.exception(e) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="关联有误") return "fail" elif interrelate_type[0] == "Regular": api_id = re.findall( '(?<=<response>\[Regular\[).*?(?=\])', value) patten = re.findall('(?<=\[").*?(?="])') param_data = json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automation_case_api=api_id[0]))) [-1]['fields']['response_data'] param_data = re.findall(patten[0], param_data.replace("\'", "\""))[0] else: record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return "fail" patten = re.compile(r'<response\[.*]') parameter[key] = re.sub(patten, str(param_data), value) else: parameter[key] = value except KeyError as e: logging.exception(e) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return "fail" if data["format_raw"]: request_parameter_type = "raw" else: parameter = AutomationParameterRawSerializer( AutomationParameterRaw.objects.filter(automation_case_api=_id)) if len(parameter): if len(parameter[0]["data"]): try: parameter = eval(parameter[0]["data"]) except Exception as e: logging.exception(e) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return 'fail' else: parameter = {} else: parameter = {} for i in head: key = i['fields']['name'] value = i['fields']['value'] if i['fields']['interrelate']: try: interrelate_type = re.findall('(?<=<request\[).*?(?=\])', value) if interrelate_type[0] == 'json': api_id = re.findall('(?<=<request\[JSON]\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) try: param_data = eval( json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automation_case_api=api_id[0])))[-1] ['fields']['responseData']) for j in a: param_data = param_data[j] except Exception as e: logging.exception(e) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return 'fail' elif interrelate_type[0] == "Regular": api_id = re.findall('(?<=<response>\[Regular\[).*?(?=\])', value) patten = re.findall('(?<=\[").*?(?="])') param_data = json.loads( serializers.serialize( 'json', AutomationTestResult.objects.filter( automation_case_api=api_id[0]))) [-1]['fields']['response_data'] param_data = re.findall(patten[0], param_data.replace("\'", "\""))[0] else: record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return "fail" patten = re.compile(r'<response\[.*]') header[key] = re.sub(patten, str(param_data), value) except Exception as e: logging.exception(e) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Error', code="", response_data="") return 'fail' else: header[key] = value try: if request_type == "GET": code, response_data, header_data = get(header, url, request_parameter_type, parameter) else: code, response_data, header_data = post(header, url, request_parameter_type, parameter) except ReadTimeout: logging.exception(ReadTimeout) record_result(_id=id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='Timeout', code=code, response_data=response_data) return 'timeout' if examine_type == "no_check": record_result(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type=examine_type, examine_data=response_parameter_list, _result='PASS', code=code, response_data=response_data) return 'success' elif examine_type == 'json': if int(http_code) == code: if not response_parameter_list: response_parameter_list = '{}' try: logging.info(response_parameter_list) logging.info(response_data) result = check_json(json.loads(response_parameter_list), response_data) except Exception: logging.info(response_parameter_list) result = check_json( eval( response_parameter_list.replace( 'true', 'True').replace('false', 'False').replace('null', 'None')), response_data) if result: record_result(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type='JSON校验', examine_data=response_parameter_list, _result='Pass', code=code, response_data=response_data) else: record_result(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type='JSON校验', examine_data=response_parameter_list, _result='FAIL', code=code, response_data=response_data) return result else: record_result(_id=_id, url=url, request_type=request_type, header=header, parameter=parameter, host=host.name, status_code=http_code, examine_type='JSON校验', examine_data=response_parameter_list, _result='FAIL', code=code, response_data=response_data) return 'fail'
def test_api(host, case_id, _id, time): """ 执行接口测试 :param host: 测试的host域名 :param case_id: 测试用例ID :param _id: 用例下接口ID :param time: 测试时间 :return: """ data = AutomationCaseApiSerializer( AutomationCaseApi.objects.get(id=_id, automationTestCase=case_id)).data http_type = data['httpType'] request_type = data['requestType'] address = host.host + data['apiAddress'] head = json.loads( serializers.serialize( 'json', AutomationHead.objects.filter(automationCaseApi=_id))) header = {} request_parameter_type = data['requestParameterType'] examine_type = data['examineType'] http_code = data['httpCode'] response_parameter_list = data['responseData'] if http_type == 'HTTP': url = 'http://' + address else: url = 'https://' + address if data['requestParameterType'] == 'form-data': parameter_list = json.loads( serializers.serialize( 'json', AutomationParameter.objects.filter(automationCaseApi=_id))) parameter = {} for i in parameter_list: key_ = i['fields']['name'] value = i['fields']['value'] try: if i['fields']['interrelate']: api_id = re.findall('(?<=<response\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) try: value = eval( json.loads( serializers.serialize( 'json', AutomationCaseTestResult.objects.filter( automationCaseApi=api_id[0], testTime=time)))[0]['fields'] ["responseData"]) for j in a: value = value[j] except: record_auto_results(_id=_id, header=header, parameter=parameter, _result='ERROR', code="", response_data="", time=time) return 'fail' except KeyError: record_auto_results(_id=_id, header=header, parameter=parameter, _result='ERROR', code="", response_data="", time=time) return 'fail' parameter[key_] = value else: parameter = AutomationParameterRawSerializer( AutomationParameterRaw.objects.filter(automationCaseApi=_id), many=True).data if len(parameter[0]["data"]): try: parameter = eval(parameter[0]["data"]) except: record_auto_results(_id=_id, header=header, parameter=parameter, _result='ERROR', code="", response_data="", time=time) return 'fail' else: parameter = [] for i in head: key_ = i['fields']['name'] value = i['fields']['value'] if i['fields']['interrelate']: try: api_id = re.findall('(?<=<response\[).*?(?=\])', value) a = re.findall('(?<=\[").*?(?="])', value) value = eval( json.loads( serializers.serialize( 'json', AutomationCaseTestResult.objects.filter( automationCaseApi=api_id[0], testTime=time)))[0]['fields']["responseData"]) for j in a: value = value[j] except Exception as e: logging.exception("ERROR") logging.error(e) record_auto_results(_id=_id, header=header, parameter=parameter, _result='ERROR', code="", response_data="", time=time) return 'fail' header[key_] = value header["Content-Length"] = '%s' % len(str(parameter)) try: if request_type == 'GET': code, response_data = get(header, url, request_parameter_type, parameter) elif request_type == 'POST': code, response_data = post(header, url, request_parameter_type, parameter) elif request_type == 'PUT': code, response_data = put(header, url, request_parameter_type, parameter) elif request_type == 'DELETE': code, response_data = delete(header, url, request_parameter_type, parameter) else: return 'ERROR' except ReadTimeout: record_auto_results(_id=_id, header=header, parameter=parameter, _result='TimeOut', code="", response_data="", time=time) return 'timeout' if examine_type == 'no_check': record_auto_results(_id=_id, header=header, parameter=parameter, _result='PASS', code=code, response_data=response_data, time=time) return 'success' elif examine_type == 'json': if int(http_code) == code: try: result = check_json(eval(response_parameter_list), response_data) except: result = check_json( eval( response_parameter_list.replace('true', 'True').replace( 'false', 'False')), response_data) if result: record_auto_results(_id=_id, header=header, parameter=parameter, _result='PASS', code=code, response_data=response_data, time=time) else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return result else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' elif examine_type == 'only_check_status': if int(http_code) == code: record_auto_results(_id=_id, header=header, parameter=parameter, _result='PASS', code=code, response_data=response_data, time=time) return 'success' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' elif examine_type == 'entirely_check': if int(http_code) == code: try: result = operator.eq(eval(response_parameter_list), response_data) except: result = operator.eq( eval( response_parameter_list.replace('true', 'True').replace( 'false', 'False')), response_data) if result: record_auto_results(_id=_id, header=header, parameter=parameter, _result='PASS', code=code, response_data=response_data, time=time) return 'success' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' elif examine_type == 'Regular_check': if int(http_code) == code: try: result = re.findall(response_parameter_list, str(response_data)) except: return "fail" if result: record_auto_results(_id=_id, header=header, parameter=parameter, _result='PASS', code=code, response_data=response_data, time=time) return 'fail' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail' else: record_auto_results(_id=_id, header=header, parameter=parameter, _result='FAIL', code=code, response_data=response_data, time=time) return 'fail'