乐趣区

关于接口:接口自动化传值处理

本文首发于:行者 AI

在接口自动化测试过程中不仅仅有单接口的测试,场景测试也必不可少,这就造成接口与接口之间存在传值问题,上面介绍一下在 pytest 框架下怎么进行接口传值解决。

接口数据总体可分为前置解决和后置解决:

前置解决:一些固定值或固定办法的调用

后置解决:须要前几个申请中的 body(参数)、response(响应)

1. 数据筹备

前置解决:

前置解决用 <> 和 [] 来标记(标记符可按本人需要进行更改),正则匹配数据中蕴含这两种标记时,读取调用 methlib.py 或 config.py 中的办法,具体调用哪个固定值或办法,依据标记外面写入的参数调用,并对数据进行替换。其中 <> 用于标记固定值,[]用于标记固定办法;

后置解决:

后置解决用 &&、{}、==、##来标记(标记符可按本人需要进行更改),正则匹配数据中蕴含这几种标记时,读取 requestmsg.txt 中数据,具体读取哪一行数据,依据关联列的数据进行判断,并对数据进行替换。其中 && 用于标记取上一步的 body、{}用于标记取上一步的 response、== 用于标记取前几步的 body、## 用于标记前上几步的 response;

注:
① excel 表中的用例传参数据须要以字典模式写入。
② 表格数据中退出关联列,用于判断读取第几个申请的参数或响应。
③ 对于局部接口须要加密的接口,在表格数据中退出是否加密列,用于判断该接口的参数是否加密。

2. 测试流程

前置解决:

读取到的 excel 表格数据是一个模块的数据,通过 pytest 的解决,会将模块中的多个接口数据(列表)进行单个接口的传输,是不必通过任何申请失去的数据,所以将其放在独自的数据处理中。上面是仅通过前置解决的流程;

后置解决:

须要通过后面几个接口的申请或响应而失去的数据,所以必须将其放在 request 申请之前,并且每发送一个接口申请,都须要在 request.txt 中写入该申请的 body 和 response,以便给前面的接口应用。上面是仅通过后置解决的流程;

上面是通过前置和后置解决的接口测试流程;

3. 代码实现

前置解决的实现:前置解决与其余申请的参数、响应无关,所以能够整个模块进行解决。

def param_method(dic_param):
    """
    固定值、取办法(不须要上一步的 body 和 response)
    :param dic_param: 必须是个字典(data 外面的参数)
    :return:
    """
    temp_mobile_ = []
    temp_email_ = []
    temp_pid_ = []
    for j in dic_param.keys():
        value__ = dic_param[j]
        _ = re.findall(r'\<(.*?)>', str(value__)) # 固定值
        __ = re.findall(r'\[(.*?)]', str(value__)) # 取办法
        if _: # 判断是否存在 apk 固定传值
            dic_param[j] = param[f'{_[0]}']
        if __:
            if j == 'mobile' or 'phone' or 'phoneNum':
                dic_param[j] = mobile()
                temp_mobile_.append(dic_param[j])
            if j == 'email':
                dic_param[j] = email()
                temp_email_.append(dic_param[j])
            if j == 'pid':
                dic_param[j] = pid()
                temp_pid_.append(dic_param[j])
            if j == 'app_order_id':
                dic_param[j] = get_random_str(30)
    return dic_param

后置解决的实现:后置解决与其余申请的参数、响应相干,所以必须在每个申请之前进行解决,上面展现的是后置解决的办法,因为代码过长,只展现了局部后置解决代码。

def prev_body_res(dic_param, relevance=None):
    '''
    取上步 body、取上步 response, 当 relevance 不为空时取上几步 body、response
    :param dic_param: 必须是字典格局
    :return:
    '''request_file = r'./requestsmsg.txt'
    for j in dic_param.keys():
        value__ = dic_param[j]
        ___ = re.findall(r'\&(.*?)&', str(value__))  # 取上步 body
        ____ = re.findall(r'\{(.*?)}', str(value__))  # 取上步 response
        _____ = re.findall(r'\#(.*?)#', str(value__))  # 取前几步的 response
        ______ = re.findall(r'\=(.*?)=', str(value__))  # 取前几步的 body
        if ___:
            request_res = readtxt(request_file)
            request_body = request_res[1]
            key = ___[0]
            res_data = request_body[f'{key}']
            dic_param[j] = str(res_data)
        if ____:
            request_response = readtxt(request_file)
            request_response = request_response[0]
            key = ____[0]
            res_data = request_response['data']
            if res_data:
                if isinstance(res_data, list):
                    temp_value = get_dict_value(request_response['data'][0], key)
                    dic_param[j] = temp_value[0]
                    temp_value.clear()
                else:
                    temp_value = request_response['data'][f'{key}']
                    dic_param[j] = str(temp_value)

后置解决具体利用:因为后置解决须要后面的申请实现之后能力失去想要的数据,所以具体后置解决放在每个申请解决之前,上面展现的是具体申请的利用。

    else:  # 传值
        line_data = prev_body_res(line_data, relevance_no)
        if i['encryption'] == '0':  # 不加密
            if header['Content-Type'] == 'application/json':
                response = requests.request(f'{request_type}', url=url, headers=header, data=json.dumps(line_data))
                write_request(response.json(), no, line_data)
                logger.info(f'response:{response.json()},no:{no},body:{line_data}')

基于 pytest 实现的模块传值解决:以数据筹备中的邮箱登录模块为例:parametrize 这个装璜器能够将整个模块的数据进行逐个发送给上面定义的办法。

    @allure.story('邮箱登录')
    @pytest.mark.qa
    @pytest.mark.formal
    @pytest.mark.parametrize('excel_data', change_data(module_data('邮箱登录'), len(module_data('邮箱登录'))))
    def test_login_email(self, excel_data):
        response = decide_value_relevance(excel_data)
        judge_result(response, '邮箱登录')
        title = excel_data['title']
        allure.dynamic.title(f'邮箱登录:{title}')

4. 总结

基于 pytest 咱们能够将咱们须要测试的场景以模块模式组装起来,再利用传值,就可构建出多个不同的失常、异样场景,减少关联性;利用表格来构建数据,也减少了构建脚本的灵活性;前期还有许多优化的中央,心愿和大家一起来探讨。

退出移动版