当前位置:网站首页>关于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"
边栏推荐
猜你喜欢
【亲测可行】error while loading shared libraries的解决方案
Mpx 插件
2022年7月10日“五心公益”活动通知+报名入口(二维码)
Monai version has been updated to 0.9. See what new functions it has
What are the test preparation materials and methods for soft exam information processing technicians?
Wallhaven wallpaper desktop version
[untitled]
Seata 1.3.0 four modes to solve distributed transactions (at, TCC, Saga, XA)
BUUCTF---Reverse---reverse1
[untitled]
随机推荐
What are the test preparation materials and methods for soft exam information processing technicians?
I plan to take part in security work. How about information security engineers and how to prepare for the soft exam?
Transaction rolled back because it has been marked as rollback-only解决
Laya common script commands
[pro test feasible] error while loading shared libraries solution
BUUCTF---Reverse---reverse1
IDEA快捷键大全
[untitled]
Deconstruction and assignment of variables
Some online academic report websites and machine learning videos
Basic knowledge of process (orphan, zombie process)
Transaction rolled back because it has been marked as rollback only
Which securities company is the best and safest to open an account for the subscription of new shares
SQL Server knowledge collection 11: Constraints
SQL Server 知识汇集9 : 修改数据
How much review time does it usually take to take the intermediate soft exam?
2022.7.6DAY598
Galaxy Kirin desktop operating system installation postgresql13 (source code installation)
ADB utility commands (network package, log, tuning related)
简单易修改的弹框组件