当前位置:网站首页>关于jmeter中编写shell脚本json的应用
关于jmeter中编写shell脚本json的应用
2022-07-07 09:03:00 【小木可菜鸟测试一枚】
一 、运用参数
在BeanShell脚本中 ,贴上此代码,会输出一个test1为json格式的的字符串。
import org.json.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
JSONObject request_data = new JSONObject();
request_data.put("merCode", "${mercode}");
request_data.put("batchNo", "${a}${b}");
request_data.put("insCode","${mercode}");
request_data.put("insName","${insName}");
request_data.put("orderId","${a}${b}");
request_data.put("idCard","${idCard}");
request_data.put("settAmt","${settAmt}");
request_data.put("userName","${userName}");
request_data.put("settAcctName","${settAcctName}");
request_data.put("tranType","${tranType}");
request_data.put("settAcct","${settAcct}");
request_data.put("acctType","${acctType}");
request_data.put("merCbName","${merCbName}");
request_data.put("merCbCode","${merCbCode}");
JSONArray jsonArray = JSONArray.fromObject(request_data);
log.info("request_data:"+jsonArray.toString());
vars.put("test1",(String)jsonArray.toString());
log.info("最终的请求参数:"+test1);
如果运行出现问题:
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
说明没有相对应的jay包:
commons-beanutils-1.8.3.jar
commons-lang-2.5.jar
ezmorph-1.0.6.jar
json-lib-2.3-jdk15.jar
这些包要去国内官方下载:戳这里
这下面这个输入框下面搜你想要的jar包,然后进去,点击,下载,看图!
一,选择第一个:commons-beanutils
二,选择最新版本的
三,下载jar包
完了之后就到本地,再把对应代码放到jemter安装目录下的lib/ext目录下
搞定完了之后,日志就会出来这样的字符串:可以结合实际使用
INFO o.a.j.u.BeanShellTestElement: request_data:[{
"merCode":"${mercode}","batchNo":"${a}${b}","insCode":"${mercode}","insName":"${insName}","orderId":"${a}${b}","idCard":"${idCard}","settAmt":"${settAmt}","userName":"${userName}","settAcctName":"${settAcctName}","tranType":"${tranType}","settAcct":"${settAcct}","acctType":"${acctType}","merCbName":"${merCbName}","merCbCode":"${merCbCode}"}]
二、结合代码
举个例子:在BeanShell里面向文件写入内容。参考原文戳这里
请求内容是这样的:{“data”: “[id1, id2, id3…]”}
使用BeanShell实现写入文件的操作,考虑一下3点:
① 写入到文件中的格式要能参数化给待测业务用
② id不可重复使用,那就要求文件中的内容每次都是新的id,即旧文件要删除
③ 虽然前置业务返回的是JSON,但考虑到Java处理JSON要依赖第3方jar包,脚本移植不方便,就直接操作字符串吧
shell代码是:
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();
注意这里有个坑,就是JMeter脚本在执行时,会先检查csv文件是否存在,不存在会报错,所以需要先手动创建一个“id.csv”在data目录下,有无内容无所谓,主要为了检查通过
三、实际使用
我需要写一个格式为这样的数据:{"A":"LOCAL","B":"Local","C":[58,76,62,78,71,61,56,70,80,74,67,60,69,55,64,72,63,59,57,73,164,163,162,68,77,75],"endDateTime":"2022-06-02 12:29:04"}
到文件里面,结果发现在csv写入不行,最后写在了txt里面。
代码如下:
import org.json.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
JSONObject data = new JSONObject();
data.put("A","LOCAL");
data.put("B","Local");
data.put("C","[58,76,62,78,71,61,56,70,80,74,67,60,69,55,64,72,63,59,57,73,164,163,162,68,77,75]");
data.put("endDateTime",vars.get("date")); //vars.get("date") date = ${__timeShift(YYYY-MM-dd HH:mm:ss,,,,)} 取当前时间
JSONArray jsonArray = JSONArray.fromObject(data);
log.info("data:"+jsonArray.toString());
var idStr = (String)jsonArray.toString();
idStr = idStr.replace("[{","{"); // 去掉 "[{、}]" 首尾的中括号
idStr = idStr.replace("}]","}");
log.info("最终请求的参数:"+idStr); //日志打印当前的参数
import java.io.*;
var idFile = vars.get("blob"); // 定义存放blob的文件路径 C:\\xx\\xx\\xx.txt
try{
File f = new File(idFile);
f.delete(); // 删除旧的idFile文件
}catch(Exception e){
e.printStackTrace();
}
FileWriter fstream = new FileWriter(idFile); //FileWriter("file01.txt",true) 追加模式
BufferedWriter out = new BufferedWriter(fstream);
out.write(idStr);//写入文件的内容
out.close();//退出文件写入
fstream.close();//退出追加
数据用到这里:关于https的文件上传相关坑可以戳这里查看
四、BeanShell断言
一、
if("${returnStatus}"=="00"){
Failure=false;
FailureMessage="交易成功";
log.info("交易成功");
}
if("${returnStatus}"=="01"){
Failure=true;
FailureMessage="md5错误";
log.info("md5错误");
}
二、
针对查询接口
import org.apache.log4j.Logger;
String response_data = prev.getResponseDataAsString();//获取接口返回的response数据
log.info("## response_data="+response_data+" ##");
if(response_data.contains(""total":"+${count})||response_data.contains(""total":null")){
Failure=false; //设置成false 表示接口跑成功,在结果树中sample是绿色的
}else{
Failure=true; //直接判断失败 表示接口跑失败,在结果树中sample是红色的
FailureMessage="错误信息";
prev.setStopThread(true);//如果断言失败,后面的接口不需要再跑,直接暂停
}
五、BeanShell取样器:MD5加密
import org.apache.commons.codec.digest.DigestUtils;
//String md5str847="${merCode}${tranAmt}${key01}";
String md5Str = DigestUtils.md5Hex("${merCode}${tranAmt}${key01}");
vars.put("md5Str",md5Str.toUpperCase());
System.out.println(md5Str);
log.info("加密后:"+md5Str);
六、获取CSV参数文件行数
一、添加用户自定义的变量:
path01 E:\新建文件夹\jmeter造数据\删除当天历史提现数据.csv
path02 E:\新建文件夹\jmeter造数据\刷卡提现.csv
path02 E:\新建文件夹\jmeter造数据\刷卡提现1.csv
二、BeanShell取样器:获取参数文件行数
import java.io.BufferedReader;
import java.io.FileReader;
BufferedReader br =new BufferedReader(new FileReader("${path01}"));
String tmpStr=null;
Integer rowCount=0;
while((tmpStr=br.readLine())!=null){
rowCount++;
}
rowCount=rowCount-1;
vars.putObject("rowCount",String.valueOf(rowCount));
log.info("第一个参数文件行数:"+String.valueOf(rowCount));
BufferedReader br1 =new BufferedReader(new FileReader("${path02}"));
String tmpStr=null;
Integer rowCount1=0;
while((tmpStr=br1.readLine())!=null){
rowCount1++;
}
rowCount1=rowCount1-1;
vars.putObject("rowCount1",String.valueOf(rowCount1));
log.info("第二个参数文件行数:"+String.valueOf(rowCount1));
BufferedReader br2 =new BufferedReader(new FileReader("${path03}"));
String tmpStr=null;
Integer rowCount2=0;
while((tmpStr=br2.readLine())!=null){
rowCount2++;
}
rowCount2=rowCount2-1;
vars.putObject("rowCount2",String.valueOf(rowCount2));
log.info("第三个参数文件行数:"+String.valueOf(rowCount2));
三、BeanShell取样器:设行数为全局变量
${__setProperty(rowCount01,${rowCount})};
${__setProperty(rowCount02,${rowCount1})};
${__setProperty(rowCount03,${rowCount2})};
六、如果(lf)控制器
举例:${threadID}=="1"&&${returnStatus_1_g0}=="00"
边栏推荐
猜你喜欢
【推荐系统 02】DeepFM、YoutubeDNN、DSSM、MMOE
P1223 queuing for water /1319: [example 6.1] queuing for water
Idea shortcut keys
简单易修改的弹框组件
[untitled]
2022年7月10日“五心公益”活动通知+报名入口(二维码)
Operation method of Orange Pie orangepi 4 lts development board connecting SATA hard disk through mini PCIe
Transaction rolled back because it has been marked as rollback-only解决
2021-04-08
想考中级软考,一般需要多少复习时间?
随机推荐
[untitled]
QT document
简单易修改的弹框组件
2022.7.4DAY596
Mysql的json格式查询
Ping tool ICMP message learning
2021-04-08
Network foundation (1)
[OneNote] can't connect to the network and can't sync the problem
July 10, 2022 "five heart public welfare" activity notice + registration entry (two-dimensional code)
PHP \ newline cannot be output
[untitled]
【OneNote】无法连接到网络,无法同步问题
SQL Server knowledge gathering 9: modifying data
Unity websocket client
The fifth training assignment
Some online academic report websites and machine learning videos
How to prepare for the advanced soft test (network planning designer)?
[machine learning 03] Lagrange multiplier method
The seventh training assignment