概述
若要从请求的响应中动态提取数据,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')); // Andersonconsole.log(jsonpath.get(json, 'age')); // 37console.log(jsonpath.get(json, 'children')); // Sara,Alex,Jackconsole.log(jsonpath.get(json, 'children[*]')); // Sara,Alex,Jackconsole.log(jsonpath.get(json, 'children.[0]')); // Saraconsole.log(jsonpath.get(json, 'children[1:2]')); // Alex,Jackconsole.log(jsonpath.get(json, 'children[1, 2]')); // Alex,Jackconsole.log(jsonpath.get(json, 'friends[:].first')); // Dale,Roger,Janeconsole.log(jsonpath.get(json, 'friends[1].last')); // Craigconsole.log(jsonpath.get(json, 'friends[?(@.age > 45)].last')); // Craig,Murphyconsole.log(jsonpath.get(json, 'friends[?(@.first =~ /D.*e/)].last')); // Murphy};
正则表达式提取器
以 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);});}