在实际压测场景中,您可以使用出参功能来提取压测接口的返回信息作为下一个请求的输入。在一个压测请求API中可以定义多个出参。本文介绍如何提取出参。

出参配置

出参定义

出参的配置项说明如下。

配置项 说明
出参名 可包含英文字母、数字、下划线(_)和短划线(-),并且只能以字母开头。
来源 标记Response的解析方式,可选择以下类型:
  • Body : JSON :以JSON格式解析Response Body。
  • Body : TEXT:以TEXT格式解析Response Body。
  • Header : K/V :以键值对格式解析Response Header。
    说明 当来源使用Header : K/V时,解析表达式的格式必须是标准的MIME类型。
  • Cookie : K/V :以键值对格式解析Cookie。
  • 响应状态码:提取Response中的状态码。
解析表达式 从Response截取需要的内容,对应到当前变量。
第几个匹配项 仅用于来源Body : TEXT时。若上一步定义的解析表达式在Response中有多个匹配时,指定第几个字符串作为出参。从0开始,-n表示倒数第n个,取值区间为 [-99,99]。如果想要取随机匹配项,请填写random

Body : JSON类型

JSON格式解析支持两种类型的返回信息:application/json和text/json。

PTS目前支持新旧版本两种JSONPath的写法,为了说明新版与旧版JSONPath之间的区别,下面分别给出两者的使用示例。

建议您使用新版JSONPath写法。

JSONPath表达式(新版)

以此处提供的JSON示例为例,您可以在下方表格中查看新版JSONPath的语法及说明。

单击展开JSONPath完整示例

{
    "menu":{
        "header":"SVG Viewer",
        "items":[
            {
                "id":0
            },
            {
                "id":1,
                "label":"Open New"
            },
            null,
            {
                "id":2,
                "label":"Zoom In"
            },
            {
                "id":3,
                "label":"Zoom Out"
            },
            {
                "id":4,
                "label":"Original View"
            },
            null,
            {
                "id":5
            },
            {
                "id":6
            },
            {
                "id":7
            },
            null,
            {
                "id":8,
                "label":"Find..."
            },
            {
                "id":9,
                "label":"Find Again"
            },
            {
                "id":10
            },
            {
                "id":11,
                "label":"Copy Again"
            },
            {
                "id":12,
                "label":"Copy SVG"
            },
            {
                "id":13,
                "label":"View SVG"
            },
            {
                "id":14,
                "label":"View Source"
            },
            {
                "id":15,
                "label":"Save As"
            },
            null,
            {
                "id":16
            },
            {
                "id":17,
                "label":"About Adobe CVG Viewer..."
            }
        ]
    }
}
JSONPath 说明
$ 根对象,例如$.menu.header对应的值为SVG Viewer
[num] 数组访问,其中num是数字。例如$.menu.items[0]对应的值为{"id":0}
[num0,num1,num2...] 数组多个元素访问,其中num是数字,返回数组中的多个元素。例如$.menu.items[0,3],返回结果是长度为2的数组,第2个元素为 {"id":2,"label":"Zoom In"}
[start:end] 数组范围访问,其中start和end是开始下标和结束下标,返回数组中的多个元素。例如$.menu.items[0:3],返回结果是长度为3的数组,第1个元素为{"id":1,"label":"Open New"} ,第2个元素为null
[?(@.key)] 对象属性非空过滤。例如$.menu.items[?(@.label)],返回结果是长度为12的数组,第1个元素为{"id":1,"label":"Open New"}
[?(@.key > 123)] 数值类型对象属性比较过滤,比较操作符支持=、!=、>、>=、<、<=。例如$.menu.items[?(@.id > 5)],返回结果是长度为12的数组,第1个元素为{"id":6}
[?(@.key = '123')] 字符串类型对象属性比较过滤,比较操作符支持=、!=、>、>=、<、<=。例如$.menu.items[?(@.label = 'Copy Again')],返回结果是长度为1的数组,第1个元素为 {"id":11,"label":"Copy Again"}
[?(@.key like 'aa%')] 字符串类型like过滤,通配符只支持%,支持not like。例如$.menu.items[?(@.label like 'Copy%')],返回结果是长度为2的数组,第1个元素为{"id":11,"label":"Copy Again"}$.menu.items[?(@.label not like 'Copy%')]返回结果是长度为10的数组,第1个元素为{"id":1,"label":"Open New"}
[?(@.key rlike 'regexpr')] 字符串类型正则匹配过滤,正则语法为jdk,支持not rlike。例如$.menu.items[?(@.label rlike 'Copy ([A-Z]+)')]返回结果是长度为1的数组,第1个元素为{"id":12,"label":"Copy SVG"}$.menu.items[?(@.label not rlike 'Copy ([A-Z]+)')]返回结果是长度为11的数组,第1个元素为{"id":1,"label":"Open New"}
[?(@.key in ('v0', 'v1'))] IN过滤,支持字符串和数值类型,支持not in。例如$.menu.items[?(@.id in (1, 2))],返回结果是长度为2的数组,第1个元素为{"id":1,"label":"Open New"}$.menu.items[?(@.id not in (1, 2))]返回结果是长度为16的数组,第1个元素为{"id":0}
[?(@.key between 234 and 456)] BETWEEN过滤,,支持数值类型,支持not between。例如:$.menu.items[?(@.id between 0 and 3)],返回结果是长度为4的数组,第1个元素为{"id":0}i返回结果是长度为15的数组,第1个元素为{"id":0}
length() 或者 size() 数组长度。例如$.menu.items.size()$.menu.items.length()均返回22。
.. 深度属性访问。例如$.menu.items..id返回结果是长度为18的数组,数组元素为每个ID对应的值。
* 对象的所有属性。例如$.menu.items.*返回结果是items对应的值。
randomIndex() 数组中的随机元素。例如$.menu.items[randomIndex()]返回items对应数组的随机元素。
['key'] 属性访问。例如$['menu']['items'],返回结果是items对应的值。
['key0','key1'] 多个属性访问。例如$['menu']['items'][3]['id', 'label']返回结果是长度为2的数组,其中第2个元素为"Zoom In"
说明 $.store.book[0].title$['store']['book'][0]['title']两种写法的语义是相同的。

JSONPath表达式(旧版)

以此处提供的JSON示例为例,您可以在下方表格中查看旧版JSONPath的语法及说明。

{
    "info": "success",
    "message": "处理成功",
    "data": {
        "id":13509, "code":0,
        "items": [
            {"name": "name1", "value": "1234"},
            {"name": "name2", "value": "8448"},
            {"name": "name3", "value": "1298"},
            {"name": "name4", "value": "3049"},
            {"name": "name5", "value": "7648"}
        ]
    }
}
            
期望获取出参的位置 旧版解析表达式 新版解析表达式(供对比参考)
获取info的值 info $.info
获取data的ID的值 data.id $.data.id
获取items第一个对象(支持相对位置)的value的值 data.items[0].value $.data.items[0].value
获取items倒数第二个对象(支持相对位置)的value的值 data.items[-2].value 不支持
获取items整个数组 data.items[ALL] $.data.items[*]
获取items数组中随机一个对象 data.items[RANDOM] $.data.items[randomIndex()]

Body : TEXT类型

TEXT格式解析支持任意文本格式且可使用正则表达式提取。当一个正则表达式有多个匹配项时,可指定第几个匹配项,默认用0表示匹配第一个。

API的Response示例如下:

<input name="id" value="34729XXXX">
<input name="token" value="acdfo4dfopasdf44dXXXX">
...
<script>
    var planId=4587;
    var planId=5689;
    var planId=8906;
</script>
            
出参的值 解析表达式 匹配数字
获取name为ID的value <input name="id" value="([0-9]*)"> 0
获取name为Token的value name="token" value="([A-Za-z0-9]*)" 0
获取第三个PlanID的值 var planId=([0-9]*); 2
随机PlanID的值 var planId=([0-9]*); random

格式规范:

  • 顺序匹配原则:按照顺序匹配出参信息。一旦匹配到之后即赋予该出参变量值,不会再匹配后续的信息,故需保证解析表达式的唯一性(除非多个中选第一个即可)。

  • 被匹配的文本内容不能包含大括号({})、小括号(())等特殊字符。

  • 使用正则表达式提取JSON类型的Response时,无需在K/V间隔的冒号后面加空格(JSON格式化展现中加入空格是为了展现优化)。可查看Response原文信息,参考下图:

    response_body

Cookie : K/V和Header : K/V类型

Cookie : K/V和Header : K/V分别用于提取Cookie字段和Header字段,解析表达式中直接写需要提取的Key即可。例如,Cookie信息为token=1234;path=/,需要提取Token的值,则解析表达式直接填写token即可。

响应状态码类型

响应状态码支持提取请求的状态码,一般情况下用于检查点或者条件跳转(不同状态码返回不同页面信息)。

出参调试

若您不能判断解析表达式是否正确时,可以在场景调试中测试解析表达式并设置出参。操作步骤如下:

  1. 单击创建PTS场景页面下方的调试场景,然后在弹出的场景调试对话框中单击场景名称,对话框右侧将显示详细信息,在右侧对话框中,选中某条API,单击点此去测试出参正则表达式
  2. 在弹出的对话框,选择来源格式,填写正则表达式,指定为第几个匹配项,填写出参参数名,单击测试表达式。通过响应详情匹配结果,预判提取的内容是否符合预期。
  3. 若需重新设置出参,则单击同步出参配置,将此正则表达式同步到该API的出参列表中。
    说明 场景调试结束后,如有同步的出参,需返回压测场景配置页签,在对应的API出参定义页签下,设置出参名。

出参示例

在理财业务中,需要根据用户的消费能力,推荐适当产品。则需要在前置接口中提取出消费能力等级作为出参,在当前的产品推荐接口中,使用该出参。

操作步骤如下:

  1. 登录PTS控制台,在左侧导航栏选择性能测试 > 创建场景,然后单击PTS压测

  2. 创建PTS场景页面,添加消费能力(含出参)产品推荐API,并填写对应的URL。
  3. 消费能力(含出参)API中,基于请求的响应详情,提取消费能力信息作为出参。填写出参名(如output)和具体的解析表达式(如data.items[0].value)。
  4. 单击创建PTS场景页面左下角的参数列表,在弹出的自定义参数页签可查看已创建的出参。单击出参参数名称(如output)或复制图标图标,系统将自动复制参数内容。
  5. 产品推荐API的Body中带入已提取的出参,在Body定义编辑框内,粘贴参数内容。ex_config_body

    此外,您也可以对Body内容进行编辑,如组合字符串、参数或函数等。