jmeter随笔(3)-从csv中获取带引号的数据详情

本文分享了JMeter在工作中的实用技巧,包括从CSV文件中正确读取带引号的数据、循环遍历CSV所有数据以及设置断言检查JSON字段是否为null的方法。

最近在工作中,对jmeter实践的点滴的记录这里分享,不一定正确,仅供参考和讨论,有想法的欢迎留言、谈论。

1技巧1:从csv中获取带引号的数据详情

背景:我们从csv中获取数据,在jmeter中使用这些数据,其中csv的数据如图,有的数据包含引号和逗号

clipboard

问题:我们获取的数据,被自动加了引号

clipboard[4]

解决办法:

1、设置jmeter的【CSV Data Set Config】,将【Allow quoted Data?】设置程true即可

clipboard[6]
2、运行jmeter脚本,查看已经成功获取到想要的数据:

clipboard[8]

总结:遇到问题很正常,耐心排查解决即可,另外俗话说工欲善其事必先利其器,对工具的了解决定你的灵活,实际中我们不可能一下子掌握工具全部细节点,但我们需要长期不断有计划的去摸索和了解工具,这样遇到问题,我们才能很快解决,让我们的技术更好落地。

2运行csv中全部数据详情

问题:需要循环获取csv中的数据,每一条数据,运行一次,直到全部运行完,但是我们发现之前用的是在【线程组】中设置循环变量的数据为csv中的数据,这样每次修改csv用例后都需要来修改脚本,比较麻烦。

解决方法:

1、在CSV Data Set Config,设置【Recyle on EOF】为false

clipboard[10]

2、在【线程组】中设置【循环次数】为【永远】

clipboard[12]

3技巧3:断言不为null的设置详情

问题:我们请求返回json数据,其中我们只需要判断json中  “total”的值不为null,即json中不出现“total":null 即可

clipboard[14]
1、添加断言,设置如图,勾选【Substring】和【否】,并且勾选【JMeter Variable】,填写的【total111】是前面正则表达式的值

clipboard[16]

clipboard[18]

<think>嗯,用户这次的问题很具体:在Linux环境的JMeter执行机上获取CSV文件行数。看来用户在做性能测试遇到了数据驱动测试的需求,需要动态获取数据集大小。 从引用内容看,用户显然已经查阅过相关资料:引用[1]展示了Windows下的Java代码方案,引用[2][3]提到CSV Data Set Config的局限性,引用[4]则是C语言方案(适用)。用户特别强调"Linux环境",说明ta的测试环境已经完成迁移,需要跨平台解决方案。 用户真正的痛点可能是:分布式测试中如何确保所有执行机都能正确获取数据量。引用[1]和[3]都暗示了重复登录和线程同步问题——这比单纯获取行数更复杂。过当前问题聚焦在行数统计,先解决基础需求。 技术上需要避开两个坑:一是Windows的"D:\\"路径写法在Linux会报错,二是避免用BeanShell以防性能损耗(引用[3]的教训)。优先推荐JSR223+Groovy方案,因为: 1. Groovy自`.count{}`方法直接统计非空行 2. File对象自动适配Linux路径分隔符 3. 比Java原生IO代码更简洁 备用方案用Stream执行命令是考虑到:如果用户CSV文件特别大(比如GB级),Groovy加载全文件可能内存溢出,用Linux原生wc命令更高效。过要提醒用户注意权限问题。 突然想到个细节:用户是否要排除标题行?引用[1]代码里有rowNum=rowNum-1的操作。所以在方案里补充了标题行处理的注释。另外分布式场景下需要确保所有执行机的CSV文件路径一致,这个在"注意事项"里特别强调。 用户可能接下来会问:如何把这个行数变量传递给其他线程组?所以预先在代码示例里展示了vars.put()的用法。毕竟在分布式测试中,参数传递是个关键点。 </think>以下是在Linux环境下使用JMeter执行机获取CSV文件行数的完整方案,结合最佳实践和引用内容: ### 方法一:JSR223+Groovy(推荐方案) ```groovy import java.nio.file.Paths String csvPath = "jmeter/bin/testdata.csv" // Linux路径格式 int lineCount = 0 new File(csvPath).withReader { reader -> while (reader.readLine() != null) { lineCount++ } } // 排除标题行(可选) if (lineCount > 0) lineCount-- vars.put("csvRowCount", lineCount as String) log.info("CSV行数统计: ${lineCount}") ``` **操作步骤**: 1. 将脚本放入`JSR223 PreProcessor` 2. 修改`csvPath`为实际路径(使用相对路径如`data/test.csv`更佳) 3. 通过`${csvRowCount}`引用行数变量 ### 方法二:Shell命令+Stream执行(大文件优化) ```groovy def cmd = "wc -l < /opt/jmeter/data/test.csv".execute() cmd.waitFor() def rawCount = cmd.text.trim() as Integer vars.put("csvRows", (rawCount - 1).toString()) // 减标题行 ``` ### 关键注意事项 1. **路径处理**(Linux特性): ```groovy // 正确示例(避免Windows反斜杠) def path = "apache-jmeter-5.1/bin/data.csv" // 绝对路径示例 def absPath = "/home/jmeter_user/testdata.csv" ``` 2. **分布式执行**[^1][^3]: - 所有Slave机器需有相同CSV路径 - 文件需通过SCP同步到所有执行机 - 建议使用共享存储(如NFS) 3. **性能优化**: - 超过10万行优先用`wc -l`命令方案 - 避免在BeanShell中处理(改用Groovy) ### 错误排查指南 | 现象 | 解决方案 | |------|----------| | `FileNotFoundException` | 检查Linux文件路径大小写敏感 | | 统计值过大 | 检查换行符格式(`dos2unix`转换) | | 空值错误 | 添加空文件判断:`if(lineCount==0){...}` | | 权限拒绝 | 执行`chmod +r data.csv` | > **引用说明**:引用[1]的Java方案在Linux需修正路径分隔符;引用[3]建议避免直接禁用CSV Data Set Config,但行数统计需独立处理[^1][^3]。 --- ### 相关问题 1. JMeter分布式测试中如何确保所有Slave机器的CSV文件同步更新? 2. 除了行数统计,如何在JMeter中实现CSV数据的**随机抽取**[^2]? 3. 当CSV文件超过1GBJMeter有哪些内存优化策略? 4. 如何验证CSV文件在Linux和Windows环境下的格式兼容性问题[^4]?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值