Jmeter如何把响应数据的结果保存到本地的一个文件

博客介绍了性能压测时统计响应数据字段的方法。先调通接口确定需统计字段,以ccmpSeq为例,添加正则表达式提取器,正则表达式为 \ccmpSeq\:\(.+?)\ 来提取该字段,添加线程数为10,运行后打开123.csv查看结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当做性能压测时,可能会需要把响应数据的一些字段统计出来。这里简单介绍一下。

1、首先把接口调通,确定需要统计的字段,这里以统计ccmpSeq字段来做例子。

 

2、添加正则表达式提取器,用来提取响应结果中的ccmpSeq

 

 

正则表达式用""包起来,如HTTP请求完成后的响应数据

{
"ccmpSeq":"CBS_queryBalance20171023131825491588",
"respTime":"20180820105000",
"respCode":"0",
"respDesc":"操作成功",
"data":{
"totalAmount":19999991000,
"accountID":"acct1470001090166"
}
}

我们只需要统计ccmpSeq,所以正则表达式为  "ccmpSeq":"(.+?)"

() 表示括起来的部分就是要提取的。

. 表示匹配任何字符串。
+ 表示一次或多次。
?表示不要太贪婪,在找到第一个匹配项后停止。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$,$3$等等,表示解析到的第几个值给seq。如:$1$表示解析到的第1个值,我们这里只有一个正则表达式,所以是$1$
(4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填1
(5)缺省值:如果参数没有取得到值,那默认给一个值让它取,通常情况下为空
 
3、在本地新建一个123.csv文件,然后添加一个BeanShell PreProcessor,用于提取结果并将之保存到123.csv文件。

 

4、添加线程数为10,运行后,打开123.csv,查看结果。 

 

转载于:https://www.cnblogs.com/wz123/p/10832472.html

<think>我们被要求使用JMeter的JSON提取器提取响应参数并写入本地文件。根据引用[3],我们可以使用JSON提取器提取多个参数,然后使用Beanshell后置处理器将提取的参数写入本地CSV文件。 步骤: 1. 添加JSON提取器:用于从JSON响应中提取需要的参数。 2. 添加Beanshell后置处理器:编写脚本将提取的参数写入CSV文件。 详细步骤: ### 1. 添加JSON提取器 假设我们的HTTP请求返回的JSON响应如下: ```json { "data": [ { "id": 1, "name": "Alice" }, { "id": 2, "name": "Bob" } ] } ``` 我们想要提取每个元素的id和name。 - 在HTTP请求下添加JSON提取器(右键点击HTTP请求 -> 添加 -> 后置处理器 -> JSON提取器) - 配置JSON提取器: - Names of created variables: 填写变量名,比如`id;name`(注意:这里用分号分隔多个变量名) - JSON Path expressions: 填写对应的JSON路径,比如`$.data[*].id;$.data[*].name` - Match No. (0 for Random): 默认-1(表示所有匹配项) - Compute concatenation var: 如果需要将所有匹配值连接成一个字符串,可以勾选(这里不勾选) 这样,提取器会生成两组变量:`id_1, id_2, ...` 和 `name_1, name_2, ...`,同时还会生成两个变量表示匹配的数量:`id_matchNr`和`name_matchNr`(实际上,因为我们是同时提取两个变量,所以匹配数量应该相同,我们可以用其中一个,比如`id_matchNr`)。 ### 2. 添加Beanshell后置处理器 接下来,我们需要将提取的变量写入CSV文件。我们可以使用Beanshell后置处理器(或者JSR223后置处理器,推荐使用Groovy,因为性能更好,但这里按照引用[3]使用Beanshell)。 - 在同一个HTTP请求下(或线程组级别,根据需求)添加Beanshell后置处理器(右键点击 -> 添加 -> 后置处理器 -> BeanShell后置处理器) - 在Beanshell脚本区域编写脚本: ```java import java.io.BufferedWriter; import java.io.FileWriter; // 获取匹配的数量 String matchNum = vars.get("id_matchNr"); // 因为我们提取了id,所以用id_matchNr int num = Integer.parseInt(matchNum); // 打开文件,true表示追加模式,如果不需要追加则改为false FileWriter fstream = new FileWriter("D:\\output.csv", true); // 文件路径,请根据实际情况修改 BufferedWriter out = new BufferedWriter(fstream); // 循环写入每一行 for (int i=1; i<=num; i++) { // 获取变量 String id = vars.get("id_" + i); String name = vars.get("name_" + i); // 写入一行,用逗号分隔 out.write(id + "," + name); out.newLine(); // 换行 } // 关闭文件 out.close(); fstream.close(); ``` 注意:如果文件不存在,FileWriter会创建文件;如果存在,且设置为追加模式(true),则会在文件末尾追加。如果不想追加,而是每次覆盖,则改为false(或者不写,默认是覆盖,但注意如果多个线程同时写可能会冲突,建议根据测试计划结构调整)。 ### 3. 注意事项 - 如果JSON提取器提取的变量名有多个,需要确保在Beanshell脚本中正确引用。 - 如果响应数据量很大,注意性能问题,可以考虑使用JSR223+Groovy。 - 写入文件路径请确保JMeter有权限写入。 ### 示例结构 - 线程组 - HTTP请求 - JSON提取器 - BeanShell后置处理器 ### 完整示例(根据引用[3]调整) 引用[3]中的例子是提取多个参数并写入CSV,我们这里也是类似。他们使用了`categoryName_matchNr`等变量,我们则使用`id_matchNr`和`name_matchNr`。 ### 相关问题 §§相关问题§§ 1. 如何避免JMeter写入文件时出现并发问题? 2. 除了Beanshell,还有哪些方法可以将提取的数据写入文件? 3. 如何确保JSON提取器正确提取了数据?</think>### JMeter JSON提取器提取响应数据保存本地文件 #### 步骤1:添加JSON提取器 1. **在HTTP请求下添加JSON提取器** - 右键点击HTTP请求 → 添加 → 后置处理器 → JSON提取器 - 配置参数: - **Names of created variables**:输入变量名(如 `id;name`,用分号分隔多个变量) - **JSON Path expressions**:填写JSON路径表达式(如 `$.data[*].id;$.data[*].name`) - **Match No.**:设为 `-1`(提取所有匹配项)[^4] - **Compute concatenation var**:勾选(生成 `_matchNr` 计数变量) 2. **JSON路径示例** - 单值提取:`$.data.id` - 多值提取:`$.data[*].items`(提取数组所有元素) - 嵌套提取:`$..address.city`(递归提取所有城市名) #### 步骤2:添加调试器(可选) - 添加 **调试后置处理器** → 查看提取的变量值(如 `id_1`, `name_1`, `id_matchNr`) #### 步骤3:写入本地文件 **方法1:使用BeanShell后置处理器**(引用[3]) ```java import java.io.*; // 获取匹配数量 String matchNum = vars.get("id_matchNr"); int num = Integer.parseInt(matchNum); // 创建文件写入流(true表示追加模式) FileWriter fstream = new FileWriter("D:\\data.csv", true); BufferedWriter out = new BufferedWriter(fstream); // 循环写入数据 for (int i=1; i<=num; i++) { String id = vars.get("id_" + i); String name = vars.get("name_" + i); out.write(id + "," + name + "\n"); } out.close(); fstream.close(); ``` **方法2:使用JSR223后置处理器(Groovy)**(推荐,性能更优) ```groovy def matchNum = vars.get('id_matchNr') as Integer def file = new File('D:/data.csv') matchNum.times { index -> int i = index + 1 def id = vars.get("id_$i") def name = vars.get("name_$i") file << "$id,$name\n" } ``` #### 关键配置说明 1. **变量命名规则** - 提取器生成格式:`变量名_1`, `变量名_2`... `变量名_matchNr` - 例如 `id_1`, `id_2`, `id_matchNr=2`[^2] 2. **文件路径处理** - 绝对路径:`D:/data.csv`(Linux/Mac用`/tmp/data.csv`) - 相对路径:`${__P(user.dir)}/results.csv`(JMeter启动目录) 3. **并发写入安全** - 加同步锁(BeanShell): `synchronized(this) { ...文件操作... }` - 使用`__threadNum`区分文件: `FileWriter("data_${__threadNum}.csv")` #### 验证结果 1. 查看CSV文件内容: ```csv 101,Alice 102,Bob ``` 2. 使用 **查看结果树** 检查提取过程 3. 通过 **聚合报告** 监控文件写入性能 > ⚠️ **注意**:生产环境建议用Groovy替代BeanShell(性能提升10倍)[^3],且路径权限需确保JMeter写入权。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值