添加请求信息(响应提取)
如果同一用例中存在多个报文,通过正则表达式或JSON提取把前一个报文的输出提取出来,作后一个报文的输入。
例如,在电商抢购场景中,您搜索对应的商品之后购买该产品,可使用响应提取功能,提取“搜索”报文得到的商品id作为下一个“购买”报文的输入参数。
约束与限制
- 响应提取不支持跨用例提取,即从用例A的报文的响应中提取值作为用例B报文的输入。
- 响应提取的变量为局部变量。
- 响应变量提取出数组后只能整体作为下个报文数组变量的输入,不能分开利用数组的每个字段。
操作视频
本视频介绍响应提取,演示响应提取操作。
操作步骤
- 登录性能测试服务控制台,在左侧导航栏中选择“PerfTest测试工程”。
- 在待编辑PerfTest测试工程所在行,单击工程名称进入测试工程详情页面。
- 选择“测试用例”页签,在左侧“用例列表”下选择待添加请求信息的用例。
- 在“用例步骤”页签中,选择待添加请求信息的用例,单击“添加请求”。
- 在“响应提取”页签,参照表1设置基本信息。
    
    表1 响应提取参数 参数 参数说明 启用响应提取 启用响应提取后,如果同一用例中存在多个报文,通过正则表达式或JSON提取把前一个报文的输出提取出来,作后一个报文的输入。 变量名称 变量的名称,命名必须唯一,响应提取的值赋予此变量。 预期值 预期响应提取出的变量值。 开启后,会将响应提取到的值与预期值进行比对,如果不等则链接失败。 提取内容范围 响应提取内容的范围。 其中,“报文内容”、“头域”和“URL”可通过正则表达式进行内容提取。 正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 “()”表示提取,对于您要提取的内容需要用小括号括起来,每个“()”之间的内容表示一个子表达式。 完整的正则表达式由两种字符构成:特殊字符(special characters)称为“元字符”(meta characters);其他为“文字”(literal),或者是普通文本字符(normal text characters,如字母、数字、汉字、下划线)。元字符的说明请参见正则表达式元字符。 第几个匹配项 在正则表达式已提取的内容中,获取第几个匹配的内容,该参数值不可设置为0。 取值范围:正整数。 表达式取值 表示解析到的第几个子表达式的值。 - 取值为0:匹配整个正则表达式。
- 取值为1:匹配正则表达式的第一个子表达式即第一个“()”提取的内容。
 取值范围:自然数。 通过“正则表达式”和“第几个匹配项”提取出内容后,再通过“表达式取值”获得最终的提取内容。 需获取的键名 输入需要获取的键名,仅在提取内容范围是json内的值时生效。 例:{"key":{"key1":"v1","key2":{"key3":"v3"},"key4":[{"key41":"v41","key42":"v42"},{"key41":"v43","key42":"v44"}]}},如果想取出"v42",则输入:key.key4[0].key42。 缺省值 正则匹配或JSON提取失败时,取的值。 条件表达式 与“需获取的键名”配套使用。 例如:{"key":{"key1":"v1","key2":{"key3":"v3"},"key4":[{"key41":"v41","key42":"v42"},{"key41":"v43","key42":"v44"}]}},如果需要表达:当key42=v42时,提取目标值v41;则在“条件表达式”框里输入:key.key4[].key42=v42,在"需获取的键名"框里输入:key.key4[].key41。 表2 常用正则表达式介绍 正则表达式 说明 示例 (\d+) 匹配非负整数 字符串: bTivm2wu9jih1LBKR4osZGrjjl 匹配结果: 2 9 1 4 ([A-Za-z]+) 匹配由26个英文字母组成的字符串 字符串: bTivm2wu9jih1LBKR4osZGrjjl 匹配结果: bTivm wu jih LBKR osZGrjjl ([A-Za-z0-9]+) 匹配由数字和26个英文字母组成的字符串 字符串: bTivm2wu9jih1LBKR4osZGrjjl:asdasd22 匹配结果: bTivm2wu9jih1LBKR4osZGrjjl asdasd22 (\w+) 匹配由数字、26个英文字母或者下划线组成的字符串 字符串: bTivm2wu9jih1LBKR4osZGrjjl:asdasd22 匹配结果: bTivm2wu9jih1LBKR4osZGrjjl asdasd22 ([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+) 匹配email地址 字符串: bTivm2wu9jih1LBKR4osZGrjjl:abc@abc.com 匹配结果: abc@abc.com 
- (可选)一个请求信息可包含1个或多个变量,如果您的请求信息需要添加多个变量,请单击“添加变量”,再设置变量的相关参数。
- 配置完成后,单击“保存”。
正则表达式响应提取示例
示例一
例如,前一个报文响应的报文内容如下所示:
"baseInfo" : {
"mobilephone":"xxxxxxxxxxx",
"Telephone":"xxxxxxxxxxx",
"unitGuid":"xx",
"unitMame":null,
"address":"xxx",
"gender" : 0,
"imageUr1" :nul1
},
"UserNotices":null
},
"msgId'" : "64xxxxxxxxxxxxxxxxxxxxxxxf5",
"isUsed" :"1"
"token":"eyxxxxxxxxxxxJ9.eyJzdW1101JYZMiLCJcUbdGUkIJezMT!!zz#z!20TxxxxxxxxxxxxxxxxxS1611dYQISHTFKifVOsImd1aWQi0ilOODkiLCJleHAiOjEiMzIizNzY1MjZ9.myU5idiASM-11@EP7YQTfTsR_8zsq7?sbYJYoxfRsuf6OZhGL-XWmjnvdaviGauhSdw16ImWOFEvbACSHMXGT1U0ijS5z6ezX@sZePruzFnvcIMgShF8xNPN6zVokQp-uwbyS3W6NpZpDuwsjuiZ7DZTNpKoqCkGHwvPJrHBOrWFR_u6-FBbTiFiqdhQb95U-1gLiLvoZHY_rguzwyrZ-leGRdCG_ZASreoWC-uH)HnqltpgItrChWQToHQyxOABdMSbBSHhNctBBZHgQPMESqQQQTbBiPGvbQDprB7ZBFMUB_ShynS_evtyfEladGEddhOBn-fxxxxxxxxxxx"
},
  如果想要获取token值的,可通过正则表达式"token"\s*:\s*"(.*?)"提取,响应提取的设置如下图所示。

示例二
例如,前一个报文响应的报文内容为:
javawind:9javawind:12 javawind:16javawind:17 javawind:46javawind:22
如果想要提取数值16,响应提取的设置如下图所示。

- 通过正则表达式javawind:(.*)javawind:(.*),提取数据如下:
    9 12 16 17 46 22 
- 通过第2个匹配项,提取数据如下:
    16 17 
- 通过第1个表达式,提取数据如下:
    16 
示例三
例如,报文内容为:ababdacac。
如果响应提取设置如下图所示:

正则表达式(ab|ac)+,表示由多个ab或者ac匹配。
第几个匹配项:1,表示由ab匹配到的,也可以输入2,表示由ac匹配到的。使用1可以得到abab及子串ab,使用2可以得到acac及子串ac。
表达式取值:0,表示使用最大匹配串abab或者acac,1表示使用子串ab或者ac。
示例四
例如,被提取内容为:HTTP响应头的Content-Type。

正则表达式Content-Type: (.*)\r\n,注意冒号后面有一个空格,结尾有\r\n,是HTTP规范产生的。
第几个匹配项:1,因为只有一个(.*)。
表达式取值:1,取到希望得到的值。
JSON表达式响应提取示例
样例数据如下:
{
    "name": {
             "first": "Tom",
             "last": "Anderson"
    },
    "age": 37,
    "children": ["Sara","Alex","Jack"],
    "fav.movie": "Deer Hunter",
    "friends": [{
             "first": "Dale",
             "last": "Murphy",
             "age": 44,
             "nets": ["ig","fb","tw"]
    },
    {
             "first": "Roger",
             "last": "Craig",
             "age": 68,
             "nets": ["fb","tw"]
    },
    {
             "first": "Jane",
             "last": "Murphy",
             "age": 47,
             "nets": ["ig","tw"]
    }]
}
  示例一
如果想要提取“英文的first name”,需获取的键名为name.first,响应提取的设置如下图所示。

示例二
如果想要提取“Tom的孩子数量”,需获取的键名为children.#,响应提取的设置如下图所示。

示例三
如果想要提取“Tom的第二个孩子的名字”,需获取的键名为children.1,注意序号从0开始,响应提取的设置如下图所示。

示例四
如果想要提取“Tom的年龄大于45岁的朋友的last name”,需获取的键名为friends.#(age>45)#.last,响应提取的设置如下图所示。

示例五
如果想要提取“Tom的last name为Murphy的朋友的first name”,需获取的键名为friends.#(last=="Murphy")#.first,响应提取的设置如下图所示。

示例六
如果想要提取“Tom的第一个朋友的第二个网名”,需获取的键名为friends.0.nets.1,注意序号从0开始,响应提取的设置如下图所示。

示例七
如果想要提取“Tom的朋友中网名为fb的朋友的first name”,需获取的键名为friends.#(nets.#(=="fb"))#.first,响应提取的设置如下图所示。

 
  