企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[toc] # JSONPath Match Assertion JSONPath 匹配断言使用 JSONPath 表达式从目标属性中选择内容,并将结果与期望值比较。如果它们匹配,断言通过,否则断言失败。 >[warning]本断言仅适用于包含 JSON 数据的请求和响应。 要了解更多关于 JSONPath 语法的知识,请参阅 [JSONPath](JSONPath.md) 。 ## 适用场景 您可以在 ReadyAPI 套件的不同应用程序中使用这个断言。根据应用程序的不同,断言验证以下数据: | 应用 | 检查数据 | 更多信息 | | --- | --- | --- | | [SoapUI](SoapUI.md) | request 和 response body | [SoapUI 断言](断言.md) | | [Secure](Secure.md) | response body | [Secure 断言](Secure断言.md) | | [ServiceV](ServiceV.md) | request body | [ServiceV 断言](ServiceV断言.md) | ## 创建断言 1、在对话框的左边,选择 **Property Content** 类别。 2、在对话框的右边,选择 **JSONPath Match** 。 3、点击 **Add** 。 **SoapUI** ![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-soap.png) **Secure** ![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-secure.png) **ServiceV** ![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-servicev.png) ## 设置断言 1、在 **JSONPath Expression** 编辑框,输入 JSONPath 表达式(指向要比较的元素),或者使用工具栏按钮 <img class="aqInlineImg" src="https://support.smartbear.com/readyapi/docs/_images/icon/node.png" > 自动生成表达式。 >[warning]1、要使用工具栏按钮,请至少运行一次 request(用于断言的 request )。 2、**JSONPath Expression** 编辑框,不支持使用属性扩展,如:`${REST Request#Response#$['data']['token']}` 。 ![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/property/json-match.png) 自动生成表达式的工具栏按钮: | 按钮 | 描述 | | --- | --- | | <img class="aqInlineImg" src="https://support.smartbear.com/readyapi/docs/_images/icon/node.png" > | 调用一个对话框,从最近的一次请求或响应中选择一个节点,并为该节点创建一个 JSONPath 表达式。 | 2、在 **Expected Result** 编辑框,输入预期值。 如果要从存在的请求或响应中可视化地选择预期结果,使用下面这些选项: | 选项 | 描述 | | --- | --- | | Select Content | 可视化地生成一个 [属性扩展](属性扩展.md) ,并赋值到预期结果编辑框。 | | Select from Current | 从最近一次响应中自动获取一个值(或者 ServiceV 虚拟服务所收到的最近一次请求) | 3、使用额外的选项来增强预期结果: | 选项 | 描述 | | --- | --- | | Allow Wildcards | 对值的不同部分使用星号通配符(\*)。<br> **提示:** 如果未选中该选项,那么当实际值是动态值时,断言将失败。 | 4、点击 **Test** 按钮,测试断言(实际值的来源为最近一次响应或 ServiceV 虚拟服务中的最近一次请求)。 ## 语法提示 1、不要对元素名称和值使用双引号,使用单引号。 2、根据表达式语法的不同,JSONPath 表达式可以返回单个值或数组。 (1)包含过滤器 `[?(filter)]` 和数组片段 `[start:end]` 的表达式总是返回数组,即使结果数组中只包含一个项。例如: ~~~ { "code" : "200", "message" : "OK", "data" : { "templetList" : [ { "tid" : "3", "name" : "K001", "type" : 0, "tips" : "animal" }, { "tid" : "5", "name" : "K002", "type" : 1, "tips" : "food" } ] } } ~~~ ~~~ $.data.templetList[?(@.tid=='5')].tips // 返回:[food] ~~~ 将返回一个数组,即使 `tips` 元素仅有一个值。要获取该值,在表达式中添加索引(下标): ~~~ $.data.templetList[?(@.tid=='5')].tips[0] // 返回:food ~~~ (2)当对象有两个或更多的属性时,对象通配符将返回一个数组。否则,将返回单个属性的值(这个值将保留原来的类型)。例如,假设需要从下列对象的获取属性: ~~~ { "section": { "first_subsection": { "name": "titular" }, "second_subsection": { "name": "secondary", "contains_images": true } } } ~~~ 下面的表达式返回 `titular` 字符串: ~~~ $.section.first_subsection.* // first_subsection 元素只有一个属性 ~~~ 下面的表达式返回一个数组: ~~~ $.section.second_subsection.* // 返回 ["name": "secondary", "contains_images": true"] ~~~ (3)数组通配符( `arr[*]` ) 的行为取决于你使用的 ReadyAPI 版本。 **在 ReadyAPI 2.3.0 中** 数组通配符总是返回一个数组。在前面的例子中,下面的表达式: ~~~ $.section.first_subsection[*] ~~~ 将返回一个数组: ~~~ ["titular"] ~~~ **在 ReadyAPI 1.9.0 – 2.2.0 中** 略 ## 示例 1、检查 `widget` 元素中的 `text` 子元素: ~~~ $.widget.text ~~~ 2、检查 `widget` 元素下的所有子元素: ~~~ $.widget.* ~~~ 3、检查 `data` 元素下 `templetList` 数组中 `tid` 子元素值为 5 的数组项(这里为数组的第二项)的 `reward` 元素: ~~~ { "code" : "200", "message" : "OK", "data" : { "templetList" : [ { "tid" : "3", "name" : "KQJX001", "type" : 0, "reward" : 10.00 }, { "tid" : "5", "name" : "KQJX002", "type" : 1, "reward" : 15.00 } ] } } ~~~ ~~~ $.data.templetList[?(@.tid=='5')].reward ~~~ --- **参考资料** 1、[ReadyAPI Documentation / Testing APIs / Verifying Results / Assertion Reference / Property Content Assertions / JSONPath Match Assertion](https://support.smartbear.com/readyapi/docs/testing/assertions/reference/property/json-match.html) --- :-: --- 贡献者名单(排名不分先后) --- :-: **材料** :-: **编写** 李云 :-: **校验** :-: **支持**