常用的jmeter脚本以及思路分享
一、随机取数据内的数组
有些请求参数在参数化时,仅仅要求取其中数组内一条数据,有些类似与数据库中设计的enum枚举类型。比如付款状态有:已付款和付款中
String[] sale_status = new String[] {"DONE", "PAID"};
int index_s=(int)(Math.random()*sale_status.length);
String saleStatus = sale_status[index_s];
vars.put("saleStatus",saleStatus);
二、获取不重复的ID
有些字段在参数化时要求不能重复,特别在高并发下时怎么办呢,这里列表一些jmeter自带的函数
${__time(MMddHHsss,)}${__Random(111111111,999999999,)} -------生成一个ID数字串
${__time(yyyy-MM-dd HH:mm:ss,)} -----按照时间格式获取当前时间
String snapshotItemCode = String.valueOf("${__V(item_code_${index})}"); -----JDBC请求获取的数据,通过循环控制器和计数器(index)
${__groovy(${total}==0)} -----如果(if)控制器,输入条件时。
三、接口返回结果Json解析
很多情况下,我们需要做数据的提取或者结果的断言,那么我们应该怎么办呢,其中一种办法可以通过Json提取器来做。还可以通过beanshell来做。
import org.json.*;String response_data = prev.getResponseDataAsString();JSONObject jsonObject = new JSONObject(response_data);JSONObject data_obj=jsonObject.getJSONObject("data");JSONArray jsonArray = data_obj.getJSONArray("data");for (int i = 0; i < jsonArray.length(); i++) {JSONObject lineobject = jsonArray.getJSONObject(i);String id = "a"+lineobject.get("id").toString();if("${tagid}".equals(id)){String coverage = lineobject.get("coverage").toString();vars.put("sucesstagsql",String.valueOf("${tagsql}"));vars.put("covernum",coverage);}}
四、数字如何进行计算
如果我们要针对商品的价格综合进行计算,那我们应该怎么写呢
import java.text.DecimalFormat;import java.math.BigDecimal;String totalAmount1 = vars.get("totalAmount");String freight1 = vars.get("freight");payAmount = String.valueOf(Double.parseDouble(freight1)+Double.parseDouble(totalAmount1));log.info("实际金额为"+payAmount);vars.put("payAmount",payAmount);String temp = String.valueOf(${balance});log.info("temp======"+temp);int adjustmentAfter = Integer.parseInt(temp)+999;log.info("adjustmentAfter======"+adjustmentAfter);vars.put("adjustmentAfter",String.valueOf(adjustmentAfter));
五、获取结果并保存到本地文件中
有时候我们拿到测试结果,需要输出到文件中,提供给开发人员,或者我们写入测试报告中作为测试结果。
import org.json.*;import com.cmcc.*;import java.util.*;String file_name = "C:/test/"+"lists.txt";File file = new File(file_name);FileOutputStream out = new FileOutputStream(file,true);String response = prev.getResponseDataAsString().toString();JSONObject jsonObject = new JSONObject(response);JSONObject mdata=jsonObject.getJSONObject("data");JSONArray jsonarray = mdata.getJSONArray("list");String list = jsonarray.toString();log.info("list=========="+list);int size = jsonarray.length();if(size>0){for(int i=0;i<size;i++){JSONObject line = jsonarray.getJSONObject(i);String balance = line.get("balance").toString();String skuCode = line.get("skuCode").toString();line.put("adjustmentNumber",999);String x = StringUtil.dotnum(balance);int afternum = Integer.parseInt(x) + 999;log.info("afternum="+afternum);line.put("adjustmentAfter",afternum);String lines = line.toString();log.info("lines=========="+lines);out.write((lines+",").getBytes());out.write("\r\n".getBytes()); //换行// vars.putObject("lists",lists); //写入到变量中}}out.close();
六、Beanshell断言
这种断言的话,可以把异常日志给输出到HTML报告中,方便问题定位
String response = "";
String Str = "\"message\":\"SUCCESS\"";
response = prev.getResponseDataAsString();
if(response.contains(Str)==false){
Failure = true;
FailureMessage = response;
log.error("返回报文异常:"+response);
}
七、获取今天和明天
比如你要预约隔日的,也就是明天的,你要怎么办
import java.text.SimpleDateFormat;
import java.util.Date;
import com.cmcc.*;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String datetime = df.format(new Date());
log.info("number==============="+${number});
String today = TimeCalc.todayTime(datetime,${number});
String tomorrow = TimeCalc.nextDay(datetime,1);
log.info("==============="+today);
log.info("==============="+tomorrow);
vars.put("today",today);
vars.put("tomorrow",tomorrow);