Exemplo n.º 1
0
def run_by_logic_test(index, base_url, path, order_prefix=''):
    config = {'config': {'name': '', 'request': {'base_url': base_url}}}
    testcase_list = []

    testcase_list.append(config)

    try:
        obj = TestCaseLogicInfo.objects.get(id=index)
    except ObjectDoesNotExist:
        return testcase_list

    include = eval(obj.include)
    request = eval(obj.request)
    name = obj.name
    project = obj.belong_project
    module = obj.belong_module.module_name

    project_info = ProjectInfo.objects.get_pro_name(project, type=False)

    # 获取工程关联的配置
    if project_info.config_id is not None:
        try:
            basic_config_request = TestCaseLogicInfo.objects.get(
                id=project_info.config_id).request
            basic_request = eval(basic_config_request)
            if basic_request.get('config').get('request') is not None:
                basic_request.get('config').get('request').setdefault(
                    'base_url', base_url)
            basic_request['config']['name'] = name
            testcase_list[0] = basic_request
        except ObjectDoesNotExist:
            # raise ObjectDoesNotExist('项目关联的配置信息不存在,请检查')
            print('项目关联的配置信息不存在')

    # 获取模块关联的配置
    if obj.belong_module.config_id is not None:
        try:
            basic_config_request = TestCaseLogicInfo.objects.get(
                id=obj.belong_module.config_id).request
            module_request = eval(basic_config_request)
            if module_request.get('config').get('request') is not None:
                module_request.get('config').get('request').setdefault(
                    'base_url', base_url)
            module_request['config']['name'] = name
            # 合并配置信息
            merge_config(testcase_list[0], module_request)
            testcase_list[0] = module_request
        except ObjectDoesNotExist:
            # raise ObjectDoesNotExist('模块关联的配置信息不存在,请检查')
            print('模块关联的配置信息不存在')

    config['config']['name'] = name

    testcase_dir_path = os.path.join(path, project)

    if not os.path.exists(testcase_dir_path):
        os.makedirs(testcase_dir_path)

        path = os.path.abspath(os.path.dirname(sys.argv[0]))
        w = open(path + '/' + 'ApiManager/utils/basic_function.py',
                 encoding='utf8')
        basic_function = w.read()

        try:
            debugtalk = DebugTalk.objects.get(
                belong_project__project_name=project).debugtalk
        except ObjectDoesNotExist:
            debugtalk = ''

        dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'),
                         basic_function + '\n' + '\n' + debugtalk)

    testcase_dir_path = os.path.join(testcase_dir_path, module)

    if not os.path.exists(testcase_dir_path):
        os.mkdir(testcase_dir_path)

    for test_info in include:
        try:
            if isinstance(test_info, dict):
                config_id = test_info.pop('config')[0]
                config_request = eval(
                    TestCaseInfo.objects.get(id=config_id).request)
                if config_request.get('config').get('request') is not None:
                    config_request.get('config').get('request').setdefault(
                        'base_url', base_url)
                config_request['config']['name'] = name
                # 合并配置信息
                merge_config(testcase_list[0], config_request)
                testcase_list[0] = config_request
            else:
                id = test_info[0]
                pre_request = eval(TestCaseInfo.objects.get(id=id).request)
                testcase_list.append(pre_request)
                # 清除get_cache_case的缓存
                del_case_cache(id)

        except ObjectDoesNotExist:
            return testcase_list

    if request['test']['request']['url'] != '':
        testcase_list.append(request)

    # 剔除备注使用的特殊关键字
    variables = testcase_list[0].get('config', {}).get('variables')
    if variables:
        for variab in variables:
            if isinstance(variab, dict):
                if '&remark&' in variab.keys():
                    variab.pop('&remark&')

    dump_yaml_file(
        os.path.join(testcase_dir_path, order_prefix + name + '.yml'),
        testcase_list)

    # 清除get_cache_case的缓存
    del_case_cache(obj.id)

    return obj.name
Exemplo n.º 2
0
    if request['test']['request']['url'] != '':
        testcase_list.append(request)

    # 剔除备注使用的特殊关键字
    variables = testcase_list[0].get('config', {}).get('variables')
    if variables:
        for variab in variables:
            if isinstance(variab, dict):
                if '&remark&' in variab.keys():
                    variab.pop('&remark&')

    dump_yaml_file(os.path.join(testcase_dir_path, name + '.yml'),
                   testcase_list)
    # 清除get_cache_case的缓存
    del_case_cache(case_info.get('test_index'))


# 单纯执行用例,不引入配置
def run_by_single3(index, base_url, path):
    config = {'config': {'name': '', 'request': {'base_url': base_url}}}
    testcase_list = []

    testcase_list.append(config)

    try:
        obj = TestCaseInfo.objects.get(id=index)
    except ObjectDoesNotExist:
        return testcase_list

    include = eval(obj.include)
Exemplo n.º 3
0
def run_by_single2(request, base_url, path):
    config = {'config': {'name': '', 'request': {'base_url': base_url}}}
    testcase_list = []

    testcase_list.append(config)

    case_info = request.get('test').get('case_info')
    module_id = case_info.get('module')
    belong_module = None
    try:
        belong_module = ModuleInfo.objects.get_module_name(module_id,
                                                           type=False)
        module = belong_module.module_name
    except ObjectDoesNotExist:
        module = '缺省模块'

    include = eval(str(case_info.get('include')))
    name = request.get('test').get('name')
    project = case_info.get('project')

    project_info = ProjectInfo.objects.get_pro_name(project, type=False)

    # 获取工程关联的配置
    if project_info.config_id is not None:
        try:
            basic_config_request = TestCaseInfo.objects.get(
                id=project_info.config_id).request
            basic_request = eval(basic_config_request)
            if basic_request.get('config').get('request') is not None:
                basic_request.get('config').get('request').setdefault(
                    'base_url', base_url)

            basic_request['config']['name'] = name
            testcase_list[0] = basic_request
        except ObjectDoesNotExist:
            # raise ObjectDoesNotExist('项目关联的配置信息不存在,请检查')
            print('项目关联的配置信息不存在')

    # 获取模块关联的配置
    if belong_module is not None and belong_module.config_id is not None:
        try:
            basic_config_request = TestCaseInfo.objects.get(
                id=belong_module.config_id).request
            module_request = eval(basic_config_request)
            if module_request.get('config').get('request') is not None:
                module_request.get('config').get('request').setdefault(
                    'base_url', base_url)
            module_request['config']['name'] = name
            # 合并配置信息
            merge_config(testcase_list[0], module_request)
            testcase_list[0] = module_request
        except ObjectDoesNotExist:
            # raise ObjectDoesNotExist('模块关联的配置信息不存在,请检查')
            print('模块关联的配置信息不存在')

    config['config']['name'] = name

    testcase_dir_path = os.path.join(path, project)

    if not os.path.exists(testcase_dir_path):
        os.makedirs(testcase_dir_path)

        path = os.path.abspath(os.path.dirname(sys.argv[0]))
        w = open(path + '/' + 'ApiManager/utils/basic_function.py',
                 encoding='utf8')
        basic_function = w.read()

        try:
            debugtalk = DebugTalk.objects.get(
                belong_project__project_name=project).debugtalk
        except ObjectDoesNotExist:
            debugtalk = ''

        dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'),
                         basic_function + '\n' + '\n' + debugtalk)

    testcase_dir_path = os.path.join(testcase_dir_path, module)

    if not os.path.exists(testcase_dir_path):
        os.mkdir(testcase_dir_path)

    for test_info in include:
        try:
            if isinstance(test_info, dict):
                config_id = test_info.pop('config')[0]
                config_request = eval(
                    TestCaseInfo.objects.get(id=config_id).request)
                if config_request.get('config').get('request') is not None:
                    config_request.get('config').get('request').setdefault(
                        'base_url', base_url)
                config_request['config']['name'] = name
                # 合并配置信息
                merge_config(testcase_list[0], config_request)
                testcase_list[0] = config_request
            else:
                id = test_info[0]
                case = TestCaseInfo.objects.get(id=id)
                pre_request = eval(case.request)
                if case.type == 2:
                    if pre_request.get('config').get('request') is not None:
                        pre_request.get('config').get('request').setdefault(
                            'base_url', base_url)
                    pre_request['config']['name'] = name
                    # 合并配置信息
                    merge_config(testcase_list[0], pre_request)
                    testcase_list[0] = pre_request
                else:
                    testcase_list.append(pre_request)
                    # 清除get_cache_case的缓存
                    del_case_cache(id)
Exemplo n.º 4
0
    def run3(self, path_or_testsets, mapping=None):
        try:
            test_suite_list = init_test_suites2(path_or_testsets)
        except exceptions.TestcaseNotFound:
            logger.log_error(
                "Testcases not found in {}".format(path_or_testsets))
            sys.exit(1)

        self.summary = {
            "success": True,
            "stat": {},
            "time": {},
            "platform": get_platform(),
            "details": []
        }

        mapping = mapping or {}

        def accumulate_stat(origin_stat, new_stat):
            """ accumulate new_stat to origin_stat
            """
            for key in new_stat:
                if key not in origin_stat:
                    origin_stat[key] = new_stat[key]
                elif key == "start_at":
                    # start datetime
                    origin_stat[key] = min(origin_stat[key], new_stat[key])
                else:
                    origin_stat[key] += new_stat[key]

        # 各用例提取的变量
        extract_parameter = {}

        for test_suite in test_suite_list:
            extract_list = test_suite.get('testcases', {})[0].get('extract')

            # # 合并各用例提取的变量
            # variables = test_suite.testcase_parser.variables
            # test_suite.testcase_parser.update_binded_variables(dict(variables, **extract_parameter))

            try:
                test_suite = TestSuite_ext(test_suite,
                                           dict(extract_parameter, **mapping))
            except exceptions.ParamsError as e:
                raise Exception("出现异常,参数错误: {0}".format(e))
            except exceptions.VariableNotFound as e:
                raise Exception("出现异常,变量不存在: {0}".format(e))
            except BaseException as e:
                raise Exception("出现异常: {0}".format(e))

            result = self.runner.run(test_suite)
            test_suite_summary = get_summary(result)

            name = test_suite.config.get("name")
            test_infos = TestCaseInfo.objects.filter(name=name).all()
            test_infos = list(test_infos)
            if test_infos:
                # 清除get_cache_case的缓存
                del_case_cache(test_infos[0].id)

            self.summary["success"] &= test_suite_summary["success"]
            test_suite_summary["name"] = name
            test_suite_summary["base_url"] = test_suite.config.get(
                "request", {}).get("base_url", "")
            test_suite_summary["output"] = test_suite.output
            print_output(test_suite_summary["output"])

            accumulate_stat(self.summary["stat"], test_suite_summary["stat"])
            accumulate_stat(self.summary["time"], test_suite_summary["time"])

            # 根据返回结果提取变量值
            if extract_list is not None and isinstance(extract_list, list):
                records = test_suite_summary.get('records')
                data_result = records[0].get('meta_data').get('response').get(
                    'json')

                if data_result is not None:
                    for extract in extract_list:
                        print(extract)
                        for key, value in extract.items():
                            try:
                                extract_value = {}
                                extract_value['content'] = data_result
                                fields = str(value).split('.')
                                extract_success = True
                                for field in fields:
                                    if isinstance(extract_value, dict):
                                        extract_value = extract_value.get(
                                            field)
                                    elif isinstance(extract_value, list):
                                        if extract_value:
                                            extract_value = extract_value[int(
                                                field)]
                                        else:
                                            extract_success = False
                                            # raise Exception('提取变量失败,', '路径:', value, '下的结果不存在,请检查')
                                if extract_success:
                                    extract_parameter[key] = extract_value
                            except AttributeError as e:
                                print('run运行错误:未提取到变量')
                            except Exception as e:
                                logger.log_error("出现错误.{0}".format(e))

            self.summary["details"].append(test_suite_summary)

        return self