云压测 响应数据提取

若要从请求的响应中动态提取数据,PTS 除了支持字符串的简单匹配(相等或包含),还支持 Jsonpath 提取器、正则表达式提取器,供你实现更加灵活的提取逻辑。

相关产品
云压测 产品页,含版本规格、价格与购买入口。

一、基本用法

你在 PTS 压测场景中编排或调试请求时,若需从响应中动态提取数据值,用于为当前请求设置检查点、或为后续请求注入参数、或在调试模式下调试具体响应字段,则你可使用数据提取器,解析和提取响应数据中的具体字段。

响应数据提取需在编排场景或者调试场景时使用。如何编排或调试场景,详情请参见 简单模式、脚本模式 和 调试场景。

二、使用场景

简单模式的场景下,你可从列表中选择具体的提取方式,然后在文本框输入符合提取器语法的表达式。以 Jsonpath 提取器为例:

脚本模式的场景下,你可使用 Get JSON field values,在脚本中实现提取数据的逻辑。以 Jsonpath 提取器为例:

三、Jsonpath 提取器

Jsonpath 提取器适用于从 JSON 类型的响应体中提取数据。Jsonpath 表达式的常用语法:

运算符 描述
@ 当前节点
* 通配符,可匹配任意节点名或索引值
.<name> 用 . 匹配下级节点
[<number> (, <number>)] 用 [] 检索数组中的一个或多个元素
[start:end] 数组切片
[?(<expression>)] 用布尔表达式筛选数据

在脚本模式下,Jsonpath 的用法及其结果示例如下:

import jsonpath from 'pts/jsonpath';export default function () { const json = JSON.stringify({ "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"]} ] }); console.log(jsonpath.get(json, 'name.last')); // Anderson console.log(jsonpath.get(json, 'age')); // 37 console.log(jsonpath.get(json, 'children')); // Sara,Alex,Jack console.log(jsonpath.get(json, 'children[*]')); // Sara,Alex,Jack console.log(jsonpath.get(json, 'children.[0]')); // Sara console.log(jsonpath.get(json, 'children[1:2]')); // Alex,Jack console.log(jsonpath.get(json, 'children[1, 2]')); // Alex,Jack console.log(jsonpath.get(json, 'friends[:].first')); // Dale,Roger,Jane console.log(jsonpath.get(json, 'friends[1].last')); // Craig console.log(jsonpath.get(json, 'friends[?(@.age > 45)].last')); // Craig,Murphy console.log(jsonpath.get(json, 'friends[?(@.first =~ /D.*e/)].last')); // Murphy};

四、正则表达式提取器

正则表达式提取器适用于从文本类型的响应中提取数据。PTS 正则表达式符合 JavaScript 原生语法,详情请参见 正则表达式。

以 PTS 场景调试为例,正则表达式提取器用法如下:

以脚本模式场景设置检查点为例,正则表达式提取器用法如下:

import { sleep, check } from "pts";import http from "pts/http";export default function main() { let response; response = http.get("http://mockhttpbin.pts.svc.cluster.local/get?name=hello"); check("body matches /h[a-z]*o/", () => { const expr = new RegExp("h[a-z]*o"); return expr.test(response.body); });}

赞 (0)
上一篇 4天前
下一篇 4天前