Beispiel #1
0
def run_by_single(index, base_url, path):
    """
    加载单个case用例信息
    :param index: int or str:用例索引
    :param base_url: str:环境地址
    :return: dict
    """
    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)
    request = eval(obj.request)
    name = obj.name
    project = obj.belong_project
    module = obj.belong_module.module_name

    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)

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

        dump_python_file(os.path.join(testcase_dir_path, '__init__.py'), '')
        dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'), 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)
                config_request.get('config').get('request').setdefault('base_url', base_url)
                config_request['config']['name'] = name
                testcase_list[0] = config_request
            else:
                id = test_info[0]
                pre_request = eval(TestCaseInfo.objects.get(id=id).request)
                testcase_list.append(pre_request)

        except ObjectDoesNotExist:
            return testcase_list

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

    dump_yaml_file(os.path.join(testcase_dir_path, name + '.yml'), testcase_list)
Beispiel #2
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
def run_by_single(index, base_url, path):
    """
    加载单个case用例信息
    :param index: int or str:用例索引
    :param base_url: str:环境地址
    :return: dict
    """
    testcase_list = {
        'config': {
            'name': '',
            'verify': "false",
            'variables': {},
            'base_url': base_url
        }
    }
    testcase_list['teststeps'] = []

    try:
        obj = TestCaseInfo.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

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

    testcase_dir_path = os.path.join(path, project)
    #加载全局变量
    if request['request']['url'] == '' and "variables" in request.keys():
        testcase_list['config']['variables'] = request['variables']
    if not os.path.exists(testcase_dir_path):
        os.makedirs(testcase_dir_path)

        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'),
                         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)['config']
                #config_request.get('config').get('request').setdefault('base_url', base_url)
                #config_request['config']['name'] = name
                testcase_list['teststeps'].append(
                    modify_validate(config_request))
            else:
                id = test_info[0]
                pre_request = eval(TestCaseInfo.objects.get(id=id).request)
                testcase_list['teststeps'].append(modify_validate(pre_request))

        except ObjectDoesNotExist:
            return testcase_list

    if request['request']['url'] != '':
        testcase_list['teststeps'].append(modify_validate(request))
    testcase_dir_path = os.path.join(testcase_dir_path, name + '.yml')
    dump_yaml_file(testcase_dir_path, testcase_list)
Beispiel #4
0
        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, 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
Beispiel #5
0
def run_by_single(index, base_url, path):
    """
    对于当个测试用例的运行
    :param index: int or str:用例索引
    :param base_url: str:环境地址 : http://47.94.172.250:33334
    :param path: api接口名字   /api/v1/account/login
    :return:
    """

    test_case_list = []
    config = {'config': {'name': '', 'request': {'base_url': base_url}}}
    test_case_list.append(config)

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

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

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

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

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

        try:
            debugtalk = DebugTalk.objects.get(
                belong_project__project_name=project).debugtalk
        except ObjectDoesNotExist:
            debugtalk = ''
        # 添加dubugtalk.py文件的路径
        dump_python_file(os.path.join(test_case_dir_path, 'debugtalk.py'),
                         debugtalk)
    # 单个测试用例的运行路径
    test_case_dir_path = os.path.join(test_case_dir_path, module)

    if not os.path.exists(test_case_dir_path):
        os.mkdir(test_case_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)
                config_request.get('config').get('request').setdefault(
                    'base_url', base_url)
                # config_request.get('request').setdefault('base_url', base_url)
                config_request['config']['name'] = name
                test_case_list[0] = config_request
            else:
                pk = test_info[0]
                pre_request = eval(TestCaseInfo.objects.get(id=pk).request)
                test_case_list.append(pre_request)

        except ObjectDoesNotExist:
            return test_case_list

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

    dump_yaml_file(os.path.join(test_case_dir_path, name + '.yml'),
                   test_case_list)
Beispiel #6
0
def run_by_single(index, base_url, path):
    """
    加载单个case用例信息
    :param index: int or str:用例索引
    :param base_url: str:环境地址
    :return: dict
    """
    testcase_list = {
        'config': {
            'name': '',
            'verify': "false",
            'variables': {},
            'base_url': base_url
        }
    }
    testcase_list['teststeps'] = []

    try:
        obj = TestCaseInfo.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
    #替换当前用例的端口
    if 'base_url' in request['request'] and request['request']['base_url']:
        testcase_list['config']['base_url'] = request['request']['base_url']
    testcase_list['config']['name'] = name
    testcase_dir_path = os.path.join(path, project)
    #加载全局变量
    if request['request']['url'] == '' and "variables" in request.keys():
        testcase_list['config']['variables'] = request['variables']
    if not os.path.exists(testcase_dir_path):
        os.makedirs(testcase_dir_path)
        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'),
                         debugtalk)

    #检查debugtakl.py 代码是否有异常,如果有抛出异常
    debugtalk_dir = os.path.join(testcase_dir_path, 'debugtalk.py')
    check_result = checkPath(debugtalk_dir)
    logger.info("check_result的值为:{}".format(check_result))
    if isinstance(check_result, int) and check_result == 1:
        shutil.rmtree(testcase_dir_path)
        raise AnalysisError("python文件解析异常,请检查debugtalk.py文件信息")
    else:
        msg = check_result[0]
        if msg > 0:
            errors = []
            for err in check_result[1]:
                errors.append(str(err.split(separator)[-1]) + "\n")
            shutil.rmtree(testcase_dir_path)
            raise SyntaxError(errors)

    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)['config']
                testcase_list['teststeps'].append(
                    modify_validate(config_request))
            else:
                id = test_info[0]
                pre_request = eval(TestCaseInfo.objects.get(id=id).request)
                testcase_list['teststeps'].append(modify_validate(pre_request))

        except ObjectDoesNotExist:
            return testcase_list

    if request['request']['url'] != '':
        testcase_list['teststeps'].append(modify_validate(request))
    testcase_dir_path = os.path.join(testcase_dir_path, name + '.yml')
    dump_yaml_file(testcase_dir_path, testcase_list)
Beispiel #7
0
def _generate_suite_file(suite_name, include, path, cfg_id):
    """
    组装测试用例到Suite中
    config:
        name: test uCloud
        base_url: 10.3.14.78:8888

    testcases:
        login:
            testcase: webviewer.yaml
            variables:
                key1:value1
                key2:value2
                key3:value3
            parameters:
               user_id:[1,2,3,4,5]
            testcase: test_name.yaml
            variables:
                key1:value1
                key2:value2
                key3:value3
            parameters:
                user_name:[a,b,c,d]
    """

    test_suite = {}

    config = {}

    config_request = eval(TestCaseInfo.objects.get(id=cfg_id).request)
    if "variables" in config_request.keys():
        config.setdefault("variables", config_request.get("variables"))
    if "base_url" in config_request.keys():
        config.setdefault("base_url", config_request.get("base_url"))
    config.setdefault("name", suite_name)
    test_suite.setdefault("config", config)

    cases = {}
    for val in include:

        case_detail = {}
        case_id = val[0]
        #case_name = val[1]
        #将测试用例中的parameters中挪到这里来
        test_obj = TestCaseInfo.objects.get(id=case_id)
        case_name = test_obj.name
        project = test_obj.belong_project
        module = test_obj.belong_module.module_name
        #如果所有的文件都是被导出的json,这里就用Json,否则就是yaml文件
        case_detail.setdefault(
            "testcase", r"{}/{}/{}.yml".format(project, module, case_name))
        test_case_request = eval(test_obj.request)
        if "parameters" in test_case_request["test"].keys():
            params = test_case_request['test']['parameters']
            tmp = []
            for param in params:
                par = {}
                for key, value in param.items():
                    if '[' in value and ']' in value:
                        par[key] = eval(value)
                    else:  #file
                        file_path = get_file_path(project, module, value)
                        val = os.path.join(os.getcwd(),
                                           file_path).replace('\\', '/')
                        par[key] = '${P(' + val + ')}'
                tmp.append(par)

            case_detail.setdefault("parameters", tmp)
        cases.setdefault(case_name, case_detail)

    test_suite.setdefault("testcases", cases)
    #暂时将测试用例放到主目录下吧
    testcase_dir_path = path
    #dump_json_file(os.path.join(testcase_dir_path, suite_name + '.yaml'), test_case_list)
    dump_yaml_file(os.path.join(testcase_dir_path, suite_name + '.yml'),
                   test_suite)
Beispiel #8
0
def run_by_single(index, base_url, path, cfg_id):
    """
    加载单个case用例信息
    :param index: int or str:用例索引
    :param base_url: str:环境地址
    :return: dict
    """
    """
    httprunner已经更新到2.2.5版本,所以,在config中没有request子项,直接写base_url.
    config = {
        'config': {
            'name': '',
            'request': {
                'base_url': base_url
            }
        }
    }
    """

    config = {'config': {'name': '', '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)
    request = eval(obj.request)
    #If ca is needed
    ca_value = obj.ca.value
    name = obj.name
    project = obj.belong_project
    module = obj.belong_module.module_name

    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)
        #update by zlinghu: 共用主目录下的debugtalk.py文件,所以直接copy过来即可
        debugtalk = os.path.join(os.getcwd(), "debugtalk.py")
        if not os.path.exists(debugtalk):
            logger.info(
                "No debugtalk found, please check if you have provided debugtalk!"
            )
            return
        else:
            shutil.copy(debugtalk, os.path.join(path, 'debugtalk.txt'))
            os.rename(os.path.join(path, 'debugtalk.txt'),
                      os.path.join(path, 'debugtalk.py'))
    testcase_dir_path = os.path.join(testcase_dir_path, module)

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

    has_cfg = False
    # 这里是判断它的前提条件里面是否有依赖用例或者是配置文件
    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)
                # setdefault: 如果存在键值,则返回当前值,否则新增键值,且它的值为给定的默认值(第二个参数)。
                config_request.get('config').setdefault('base_url', base_url)
                #因为httprunner升级,config节点下没有request子节点,而是直接写base_url
                #config_request.get('config').get('request').setdefault('base_url', base_url)
                config_request['config']['name'] = name
                testcase_list[0] = config_request
                has_cfg = True
            else:
                id = test_info[0]
                # TODO:消除测试用例级别的params.... 直接移除字典中的key(params)-value不知是否可行
                pre_request = eval(TestCaseInfo.objects.get(id=id).request)
                if pre_request['test']['request']['url'] != '':
                    #if ca is needed
                    ca_value_pre = TestCaseInfo.objects.get(id=id).ca.value
                    pre_request = update_request(pre_request, ca_value_pre)
                    testcase_list.append(pre_request)

        except ObjectDoesNotExist as e:
            logger.info(e)
            return testcase_list

    # 将cfg提到suite级别后,在每个test中都手动添加suite级别添加的config文件。
    # TODO:suite级别的测试配置文件,需要更新到每一个测试用例级别吗?直接放在suite级别不可以吗?
    if not has_cfg:
        config_id = cfg_id
        config_request = eval(TestCaseInfo.objects.get(id=config_id).request)
        config_request.get('config').setdefault('base_url', base_url)
        #因为httprunner升级,config节点下没有request子节点,而是直接写base_url
        #config_request.get('config').get('request').setdefault('base_url', base_url)
        config_request['config']['name'] = name
        testcase_list[0] = config_request

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

    #更新每个测试用例,将配置文件中的header等信息更新到用例中去。
    update_request_ex(testcase_list, cfg_id)

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