Jmeter中json取样器获取的值为空或者空格时,赋予默认值

这段代码展示了在Java中,如果`subjectContact`变量经过trim()处理后为空,会设置一个默认值联系人并记录日志。
if (vars.get("subjectContact").trim().isEmpty()) {
    log.info("赋予联系人默认值");
    vars.put("subjectContact", "联系人");
}

<think>我们使用JMeterJSON提取器来获取接口返回中所有ID,并统计其数量。根据引用[3],我们可以设置JSON提取器的Match No.为-1来提取所有匹配的。然后,我们可以通过JMeter的内置变量来获取匹配的数量(即ID的数量)。 步骤如下: 1. 添加HTTP请求:发送请求到目标接口。 2. 添加JSON提取器:用于提取所有ID。 3. 添加调试后置处理器(可选):用于查看提取的变量。 4. 添加BeanShell后置处理器或JSR223后置处理器:用于统计ID的数量并将其存储为变量。 5. 添加查看结果树:用于查看结果。 详细步骤: ### 步骤1:添加HTTP请求 在JMeter中,创建一个线程组,然后添加一个HTTP请求,配置好接口的URL、方法等参数。 ### 步骤2:添加JSON提取器 在HTTP请求下添加后置处理器 -> JSON提取器(或者使用插件JSON/YAML Path Extractor,但根据引用[4],JMeter自带JSON提取器)。 配置JSON提取器: - Names of created variables: 填写一个变量名,例如`id`(注意:如果提取多个,实际存储的变量会是`id_1`, `id_2`, ..., 以及`id_matchNr`表示匹配的数量)。 - JSON Path Expressions: 填写提取ID的JSON Path表达式,例如`$.data[*].id`(具体根据返回的JSON结构,如果ID在数组中的每个对象的id字段,则这样写)。 - Match No. (0 for Random): 填写`-1`,表示提取所有匹配的(引用[3])。 - Compute concatenation var: 如果勾选,会生成一个变量(如`id_ALL`)将匹配的所有用逗号连接。这里我们不需要,因为我们主要关心数量。 - Default Values: 可以留。 注意:JSON Path表达式需要根据实际返回的JSON结构来写。例如: - 如果返回是一个对象,里面有一个数组,数组中的每个元素有id,则用`$.data[*].id`。 - 如果返回是数组,则用`$[*].id`。 ### 步骤3:使用内置变量获取匹配数量 在JSON提取提取后,会自动生成一个变量`id_matchNr`(其中`id`是你在Names of created variables中填写的变量名),这个变量保存了匹配到的ID的数量。 因此,我们不需要额外的代码就可以直接使用这个变量来表示ID的数量。 ### 步骤4:在后续请求或断言中使用 我们可以直接使用`${id_matchNr}`来引用这个数量。例如,可以在调试取样器中查看,或者使用断言来验证数量。 ### 示例:添加调试取样器查看结果 1. 添加一个调试取样器(Debug Sampler),这样可以在查看结果树中看到所有变量。 2. 运行测试,在查看结果树中选择调试取样器,可以看到变量`id_matchNr`的就是ID的数量。 ### 验证数量 如果你想在测试中验证这个数量,可以添加一个响应断言: - 在HTTP请求下添加断言 -> 响应断言。 - 选择“JMeter变量”,变量名填写`id_matchNr`。 - 设置期望的数量,例如等于某个数字。 或者,你也可以使用BeanShell断言来更灵活地处理,但这里直接使用变量即可。 ### 完整流程 1. 线程组 2. HTTP请求 3. JSON提取器(配置如上) 4. 调试取样器(可选) 5. 查看结果树 运行后,在查看结果树中查看调试取样器,可以看到`id_matchNr`变量,其就是ID的数量。 注意:如果接口返回的JSON中不存在ID,那么`id_matchNr`将为0。 ### 特殊情况处理 如果JSON结构复杂,可能需要调整JSON Path表达式。可以使用在线JSON Path测试工具来验证表达式。 另外,如果返回的数据量很大,提取所有ID可能会占用较多内存,但在性能测试中通常可以接受。 ### 引用说明 根据引用[3],设置Match No.为-1可以提取所有匹配的,并生成`_matchNr`变量表示匹配数量[^3]。 因此,我们不需要编写额外的代码来统计数量,直接使用`${id_matchNr}`即可。 总结:使用JMeterJSON提取提取ID,然后使用自动生成的`${id_matchNr}`变量表示ID的数量。 下面是一个配置示例的截图描述(文字描述): - JSON提取器: Variable names: id JSON Path: $.data[*].id Match No.: -1 然后就可以在后续步骤中使用`${id_matchNr}`。 如果还有疑问,可以添加一个BeanShell后置处理器打印变量: - 在BeanShell后置处理器中写: log.info("id_matchNr = " + vars.get("id_matchNr")); 这样可以在日志中看到数量。 现在,您已经知道如何使用JMeterJSON提取获取接口返回中ID的数量了。</think>### 使用JMeter JSON提取获取接口返回ID数量的方法 通过JMeterJSON提取器可以高效地统计接口返回数据中ID的数量。核心方法是利用JSON Path表达式提取所有ID,并通过`_matchNr`变量自动获取匹配数量。以下是详细步骤: --- ### 操作步骤 1. **添加HTTP请求** - 创建线程组 → 添加HTTP请求采样器 - 配置接口URL、请求方法(GET/POST)和参数 2. **添加JSON提取器** - 右键点击HTTP请求 → 添加 → 后置处理器 → **JSON提取器** - 关键配置参数: ```markdown | 参数 | | 说明 | |-----------------------|-----------------|----------------------------------------------------------------------| | Names of created variables | id | 存储ID的变量名(自动生成`id_matchNr`统计数量) | | JSON Path Expressions | $.data[*].id | JSON Path表达式(根据实际数据结构调整) | | Match No. | -1 | **关键参数**:-1表示提取所有匹配[^3] | | Compute concatenation | (可选) | 勾选后生成`id_ALL`包含所有ID的逗号分隔字符串 | ``` 3. **验证ID数量** - 添加调试取样器(Debug Sampler)查看提取的变量 - 在结果树中检查`id_matchNr`的即为ID数量 - 或使用BeanShell断言验证: ```java // BeanShell断言代码 int idCount = Integer.parseInt(vars.get("id_matchNr")); log.info("ID数量: " + idCount); Failure = idCount == 0; // 如果ID数量为0则标记失败 ``` --- ### JSON Path表达式示例 根据不同数据结构调整表达式(参考引用[3][4]): | 数据结构示例 | JSON Path表达式 | 说明 | |-----------------------------|----------------------|--------------------------| | `{"data":[{"id":1},{"id":2}]}` | `$.data[*].id` | 提取数组内所有对象的ID | | `[{"id":101},{"id":102}]` | `$[*].id` | 直接提取数组中的ID | | 嵌套结构`{"result":{"items":[{"id":3}]}}` | `$..id` | **递归提取**所有层级的ID | > ⚠️ 注意:使用`$..id`可能提取到非目标ID,需确保数据结构清晰[^4]。 --- ### 完整流程示例 1. **线程组设置** - 线程数:1 (测试用) - 循环次数:1 2. **HTTP请求** - 协议:HTTPS - 服务器名称:api.example.com - 路径:/users 3. **JSON提取器配置** ```markdown - Variable names: userId - JSON Path: $.users[*].id - Match No.: -1 ``` 4. **添加查看结果树** 运行后查看`userId_matchNr`的即为ID数量 5. **添加聚合报告**(可选) 验证统计结果是否与预期一致 --- ### 常见问题解决 1. **提取数量为0** - 检查JSON Path是否正确(使用`View Results Tree`验证) - 确认响应是JSON格式(非HTML/XML) - 使用`$`测试根路径是否有效 2. **部分ID未提取** - 嵌套结构使用递归表达式:`$..id` - 检查ID字段是否为null(null不会被统计) 3. **性能优化** - 大数据量避免使用递归`$..`(改用精确路径) - 分页处理:在循环控制器中使用`page=${__counter(TRUE,)}`[^4] --- ### 验证方法 1. **调试取样器** ```json { "userId_matchNr": "15", // ID数量 "userId_1": "1001", "userId_2": "1002", ... } ``` 2. **JSR223断言** ```groovy def idCount = vars.get('userId_matchNr') as Integer if (idCount < 1) { AssertionResult.setFailureMessage("未找到ID") } ``` 3. **BeanShell日志** ```java log.info("ID总数: " + vars.get("userId_matchNr")); ``` 通过以上方法,您可直接通过`${userId_matchNr}`获取ID数量,无需额外代码[^3]。 --- ### 相关问题 1. 如何在JMeter中处理分页接口并统计所有页面的ID总数? 2. 当JSON返回的ID字段名不一致(如`id`/`user_id`)如何统一提取? 3. 如何使用JMeter断言验证接口返回的ID数量是否符合预期? 4. 在分布式测试中如何聚合多个JMeter节点的ID统计结果? 5. 如何将JMeter提取的ID数量导出到CSV报告进行分析? [^1]: JSON提取器基础配置方法 [^3]: 使用Match No.=-1提取所有并生成统计变量 [^4]: JSON Path表达式高级用法和嵌套结构处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwTesting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值