接口平台接口之间的数据传递

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口平台接口之间的数据传递相关的知识,希望对你有一定的参考价值。

一、使用场景

B接口请求参数依赖于A接口返回的数据,希望B接口发送请求的时候能获取A接口返回的数据作为请求参数

二、实现思路

A接口使用后置操作->提取变量功能将请求完成后返回的对应数据提取到变量
B接口对应的参数值直接引用前面设置的变量

三、使用示例

3.1 前置脚本接口请求提取变量

在前置脚本的Tab,添加接口请求前置,将接口返回Response JSON数据里的token值提取到名为token的变量

3.2 接口参数引用变量

对应的参数值里写入$token$,即引用可名为token的变量

四、解析数据

往往执行的结果并不能直接赋予变量,比如获取到某一个json数据"clazz": 1,"grade":"unitId":20180220,需要将该unitId字段的值赋给变量p1,如何获取呢?

4.1 key value的方式

将返回值中"name": "lluozh平台"…的name赋值给变量NameStr,填写方式如:

4.2 多级子节点

将返回值中…"address": "street": "科学城", "city": "广东广州", "country": "中国""…的street赋值给 StreetStr,填写方式如:

4.3 数组

将返回值中…"links": ["name": "Google", "url": "http://www.google.com", "name": "Baidu", "url":"http://www.baidu.com", "name": "SWServer", "url": "http://swqa.gz.cvte.cn/devices"]…第三个name,即SWServer赋值给LinkNameStr,填写方式如:

支持links[-1].name的方式获取数组数据

五、系统变量

平台提供系统变量 BODY 和 RESPONSE

  • BODY:前置条件接口请求的body信息
  • RESPONSE:前置条件接口请求的响应值

使用栗子:
RESPONSE为json类型

@getResponseConfigId($RESPONSE$)@

RESPONSE为string类型

@getResponseConfigId("$RESPONSE$")@

六、变量调用

对于不同方式赋值的变量,在运行过程中,都存储于变量池中

在所有输入框输入$时,该输入框出现下拉列表,下拉列表中为全局变量,选中某个变量后,会自动补全该变量的调用$变量名称$

支持变量中嵌套变量的方式$变量名称1[$变量名称2$]$

类型自动识别
支持自动识别变量的数据类型


   "resetPasswordDto": 
      "dynamicCode": "$dynamicCode$",
      "newPassword": "$pwd$",
      "username": "$phone$",
      "userInfo": "$userInfo$"

   

如上json格式,四个变量值分别为

dynamicCode = 2356
newPassword = "swapi"
phone = "15800000000"
userInfo = 
                "class":"高一"
           

其中dynamicCode 为int类型,newPassword 和phone 为string类型,userInfo 为dict类型

替换后结果是

"resetPasswordDto": 
      "dynamicCode": 2356,
      "newPassword": "swapi",
      "username": "15800000000",
      "userInfo": 
                "class":"高一"
            
   

针对替换的变量的数据类型进行识别,自动替换数据(如int类型自动去掉双引号)

七、实现源码

def _variable_placeholder_(self, value):
    """
    处理全局变量占位符
    :param value:
    :return:
    """
    try:
        if isinstance(value, dict):
            for key in value:
                value[key] = self._variable_placeholder_(value[key])
            return value
        # 匹配字符串中$$字符
        matches = re.findall('\\\\$([\\\\w\\\\.\\\\-\\\\[\\\\]]+)\\\\$', str(value))
        # 标志位,是否替换成功
        g_flag = True
        for match in matches:
            # 截取首个字符,判断是否在全局变量中
            match_first = str(match).split(".")[0].split("[")[0]
            if match_first in HttpsGlobalVar.globalVariables:
                # 调用函数处理变量
                _value_ = JsonParse().parse_var(str(match), HttpsGlobalVar.globalVariables)
                # 非字符串数据类型的value需要替换外面包围的""双引号
                if not isinstance(_value_,str):
                    # 判断是否是None
                    _value_ = 'null' if _value_ is None else _value_
                    # findall中[]需要特殊处理
                    match_replace = match if match_first == match else str(match).replace("[","\\\\[").replace("]","\\\\]")
                    # 匹配字符串中"$$"字符
                    if len(re.findall('\\"\\\\$'+match_replace+'\\\\$\\"', str(value))) > 0:
                        # 如果匹配上即,替换"$$"变量值
                        value = str(value).replace('\\"$' + match + '$\\"', str(_value_))
                    elif len(re.findall("\\'\\\\$"+match_replace+"\\\\$\\'", str(value))) >0:
                        # 如果匹配上即,替换'$$'变量值
                        value = str(value).replace("\\'$" + match + "$\\'", str(_value_))
                    else:
                        # 如果匹配不了,即替换$$变量值
                        value = str(value).replace('$' + match + '$', str(_value_))
                else:
                    # 字符串类型的数据,直接替换变量值
                    if len(re.findall("\\'\\\\$"+match_first+"\\\\$\\'", str(value))) > 0:
                        value = str(value).replace("\\'$" + match + "$\\'", '"'+str(_value_)+'"')
                    else:
                        value = str(value).replace('$' + match + '$', str(_value_))
            else:
                g_flag = False
        if g_flag:
            # 判断是否仍有匹配的变量
            if len(re.findall('\\\\$([\\\\w\\\\.\\\\-\\\\[\\\\]]+)\\\\$', str(value))) != 0:
                value = self._variable_placeholder_(value)
        return value
    except Exception as e:
        HttpsGlobalVar.errorObject.error_record("[过程处理-处理全局变量占位符]" + str(e))
        traceback.print_exc(e)
        return value

以上是关于接口平台接口之间的数据传递的主要内容,如果未能解决你的问题,请参考以下文章

话说接口测试

接口测试的切入点

SoapUI接口之间的数据传递

Activity和Fragment之间的数据传递

Activity和Fragment之间的数据传递

自动化接口测试平台:从excel读取数据,传递到request请求中获取不到参数问题