关于jmeter中编写shell脚本json的应用

一 、运用参数

在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

关于jmeter中编写shell脚本json的应用_第1张图片

二,选择最新版本的

关于jmeter中编写shell脚本json的应用_第2张图片

三,下载jar包

完了之后就到本地,再把对应代码放到jemter安装目录下的lib/ext目录下

关于jmeter中编写shell脚本json的应用_第3张图片

搞定完了之后,日志就会出来这样的字符串:可以结合实际使用

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的文件上传相关坑可以戳这里查看
关于jmeter中编写shell脚本json的应用_第4张图片

四、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"

你可能感兴趣的:(jmeter,json,restful,java)