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
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
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']),
        # 清空测试缓存结果
Exemplo n.º 6
0
    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