一、基本用法
你在 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); });}