JMeter BeanShell向文件中写入内容
项目背景
-
待压测的业务依赖前置业务的response
-
前置业务不在压测范围内
-
前置业务的response格式大致如下:
{"data": "[id1, id2, id3...]"}
-
待压测业务每次请求消耗一个id,同时希望能把每次用到的id记录下来
实现方案
-
既然前置业务能一次性返回所需的id,那在setUp线程组中完成准备测试数据即可
-
使用BeanShell实现写入文件的操作,考虑一下3点:
① 写入到文件中的格式要能参数化给待测业务用
② id不可重复使用,那就要求文件中的内容每次都是新的id,即旧文件要删除
③ 虽然前置业务返回的是JSON,但考虑到Java处理JSON要依赖第3方jar包,脚本移植不方便,就直接操作字符串吧
具体细节
-
在setUp线程组中新建前置业务的Sampler和JSON Extractor
-
在Sampler下继续添加后置处理器BeanShell
import java.io.*; var idFile = "data/id.csv"; // 定义存放id的文件路径 try{ File f = new File(idFile); f.delete(); // 删除旧的idFile文件 }catch(Exception e){ e.printStackTrace(); } var idStr = vars.get("data"); // 获取JSON Extractor中提取的data idStr = idStr.replace("[",""); // 去掉 "[id1, id2, id3...]" 首尾的中括号 idStr = idStr.replace("]",""); String[] temp = idStr.split(","); // 以"," 分割字符串 "id1, id2, id3...",保存成String类型的数组 FileWriter fstream = new FileWriter(idFile); //FileWriter("file01.txt",true) 追加模式 BufferedWriter out = new BufferedWriter(fstream); for (int i = 0; i < temp.length; i++){ out.write(temp[i]); out.write(System.getProperty("line.separator")); // 换行 } out.close(); fstream.close();
-
接下来就可以在待测业务的线程组中新建【CSV数据文件设置】
- 注意这里有个坑,就是JMeter脚本在执行时,会先检查csv文件是否存在,不存在会报错,所以需要先手动创建一个“id.csv”在data目录下,有无内容无所谓,主要为了检查通过