有奖捉虫:云通信与企业服务文档专题,速来> HOT

概述

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

基本用法

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

使用场景

简单模式的场景下,您可从列表中选择具体的提取方式,然后在文本框输入符合提取器语法的表达式。以 Jsonpath 提取器为例:
截屏2022-10-28 15.49.31.png


脚本模式的场景下,您可使用 JavaScript API,在脚本中实现提取数据的逻辑。以 Jsonpath 提取器为例:
截屏2022-10-28 15.48.46.png



提取器类型

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 场景调试为例,正则表达式提取器用法如下:
截屏2022-10-28 17.55.39.png


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

截屏2022-10-28 18.05.43.png


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);
});
}