def import_base_handler(self): json_file = request.files.get('json-import') mimetype = json_file.content_type # 判断是不是json格式的文件 if mimetype == 'application/json': # 读取文件流,注意文件流只能read一次 bytes_obj = json_file.read() try: check_result = BaseDataHandler().check_base(json.loads(bytes_obj)) if check_result: return check_result self.write_wb(DEFAULT_BASE, bytes_obj) # 读取json文件 json_obj = json.loads(codecs.open(DEFAULT_BASE, 'r', 'utf-8').read()) # 获取文件的sha1 app_context.base_sha1 = self.get_sha1(bytes_obj) # 初次处理,切换后的result mergeAlgorithm.first_result_handler(json_obj) mergeAlgorithm.coverage_arithmetic(json_obj) resp = context.make_ok_response() lyrebird.publish('api_coverage', 'operation', name='import_base') except Exception as e: resp = context.make_fail_response('导入文件内容格式有误:' + str(e)) lyrebird.publish('api_coverage', 'error', name='import_base') else: resp = context.make_fail_response("Error.The selected non - JSON file.") lyrebird.publish('api_coverage', 'error', name='import_base') return resp
def clear_result(self): ResultHandler().clear_cache_result() # 获取基准文件 base_dict = BaseDataHandler().get_base_source() # 初始化正常会进行数据的处理:覆盖率初始化 & API LIST初始化 if not isinstance(base_dict, Response): mergeAlgorithm.first_result_handler(base_dict) mergeAlgorithm.coverage_arithmetic(base_dict) lyrebird.publish('api_coverage', 'operation', name='clear_result') return context.make_ok_response()
def on_create(self): # 获取base_data_config文件信息 base_dict = BaseDataHandler().get_base_source() # 如果import的文件异常 if not isinstance(base_dict, Response): mergeAlgorithm.first_result_handler(base_dict) mergeAlgorithm.coverage_arithmetic(base_dict) # 设置模板目录(可选,设置模板文件目录。默认值templates) self.set_template_root('lyrebird_api_coverage') # 设置静态文件目录(可选,设置静态文件目录。默认值static) self.set_static_root('lyrebird_api_coverage') # 设置跟路径(必选,需要提供跟路径用于显示插件首页的内容) self.add_url_rule('/', view_func=self.index) # 总线消息订阅 event_subscribe() # 获取内存里保存的测试结果API self.add_url_rule('/getTest', view_func=self.get_test_data) # 获取内存里保存的测试覆盖率信息 self.add_url_rule('/getCoverage', view_func=self.get_coverage) # 保存测试数据在本地 self.add_url_rule('/saveResult', view_func=self.save_result, methods=['POST']) # 续传测试结果 self.add_url_rule('/resumeTest', view_func=self.resume_test, methods=['POST']) # 清空测试缓存结果 self.add_url_rule('/clearResult', view_func=self.clear_result) # 导入base json文件 self.add_url_rule('/importBase', view_func=self.import_base, methods=['POST']) # 获取filter的conf文件 self.add_url_rule('/getFilterConf', view_func=self.get_filter_conf) # 覆盖配置filter conf文件 self.add_url_rule('/setFilterConf', view_func=self.set_filter_conf, methods=['POST']) # overbridge dump 信息用的API self.add_url_rule('/api/dump', view_func=self.dump) # base info self.add_url_rule('/baseInfo', view_func=self.get_base_info)
def get_test_data(self): # 获取app_context里面缓存的测试数据 # 如果内存为空,则视为首次进入该页面 data = app_context.merge_list if not data: # 获取base_data_config文件信息 base_dict = BaseDataHandler().get_base_source() # 如果import的文件异常 if isinstance(base_dict, Response): resp = base_dict else: mergeAlgorithm.first_result_handler(base_dict) resp = jsonify({'test_data': app_context.merge_list}) # 若不为空,则视为有测试缓存 else: resp = jsonify({'test_data': app_context.merge_list}) return resp
from lyrebird.plugins import manifest from . import api from . import interceptor from flask import Response from lyrebird_api_coverage.handlers.base_source_handler import BaseDataHandler from lyrebird_api_coverage.client.merge_algorithm import mergeAlgorithm from lyrebird_api_coverage.client.event_subscibe import event_subscribe # 执行插件初始化操作 # 获取base_data_config文件信息 base_dict = BaseDataHandler().get_base_source() # 如果import的文件异常 if not isinstance(base_dict, Response): mergeAlgorithm.first_result_handler(base_dict) mergeAlgorithm.coverage_arithmetic(base_dict) # 总线消息订阅 event_subscribe() manifest( id='api_coverage', name='APICoverage', api=[ # 获取内存里保存的测试结果API ('/api/getTest', api.get_test_data), # 获取内存里保存的测试覆盖率信息 ('/api/getCoverage', api.get_coverage), # 保存测试数据在本地 ('/api/saveResult', api.save_result, ['POST']), # 续传测试结果 ('/api/resumeTest', api.resume_test, ['POST']), # 清空测试缓存结果
def handle(self, handler_context: HandlerContext): # UI自动化等需要mock的手段orgin url 需要调用这个方法 org_url = handler_context.get_origin_url() if not org_url: org_url = handler_context.request.url short_url = org_url.replace('http://', '').replace('https://', '').split('?')[0] # format之后的真正PATH,处理{num}这样的情况,emit给前端,做刷新table用,同时处理成小写 path = format_url.format_api(short_url).lower() # 获取handler_context.id,为前端展开看详情准备 path_id = handler_context.id device_ip = handler_context.request.headers.get('lyrebird.device.ip') # 当请求过来的时候,base还没有init,需要进行init处理 if not app_context.base_list: base_dict = BaseDataHandler().get_base_source() if isinstance(base_dict, Response): lyrebird.get_logger().error('API-Coverage base file is None.') else: mergeAlgorithm.first_result_handler(base_dict) if path in app_context.base_list: # merge到 context merge list中 mergeAlgorithm.merge_handler_new(path, path_id) # 在base里的需要去计算下覆盖率 mergeAlgorithm.coverage_handler() # path传给覆盖详情表格 lyrebird.emit('test_data message', path, namespace='/api_coverage') # 如果设备信息抓取到,进行上报 # if device_ip in app_context.info: report_worker(path, device_ip) # 如果path配置了对应的参数 if path in list(app_context.path_param_dic.keys()): ulr_list = app_context.path_param_dic[path] flag = 0 for item in ulr_list: if compare_query(item['url'], handler_context.request.url): mergeAlgorithm.merge_handler_new(item['url_base'], path_id) mergeAlgorithm.coverage_handler() lyrebird.emit('test_data message', item['url_base'], namespace='/api_coverage') # 如果设备信息抓取到,进行上报 # if device_ip in app_context.info: report_worker(item['url_base'], device_ip) flag = 1 # 如果参数组合不存在,提取关注的字段 if flag == 0: url_pgroup = '' params_list = [] for item in ulr_list: params_list.extend(item['params'].keys()) # 去重 for p in list(set(params_list)): val = handler_context.request.args.get(p) if url_pgroup: url_pgroup = url_pgroup + '&' + str(p) + '=' + str(val) else: url_pgroup = path + '?' + str(p) + '=' + str(val) mergeAlgorithm.merge_handler_new(url_pgroup, path_id) mergeAlgorithm.coverage_handler() lyrebird.emit('test_data message', url_pgroup, namespace='/api_coverage') # 如果设备信息抓取到,进行上报 # if device_ip in app_context.info: report_worker(url_pgroup, device_ip) # 如果不在base里,需要判断这些API是否被筛掉 else: # 如果不在筛除列表内,才进行merge等一系列算法 if not Filter().filter_all(path): # merge到 context merge list中 mergeAlgorithm.merge_handler_new(path, path_id) # 传给api_coverage前端的socket信息 lyrebird.emit('test_data message', path, namespace='/api_coverage') # 如果设备信息抓取到,进行上报 # if device_ip in app_context.info: report_worker(path, device_ip) else: pass