⽤jmeter录制考试上传成绩等脚本时,出现的问题及解决⽅法如下:1、beanshell前置处理器,不能读取本地csv⽂件⾥的数据:⽅法⼀:
在beanshell⾥不能直接从本地的csv⽂件⾥读取到tid的值,幸好tid数据是有规律的,从700000开始,依次增加,于是通过如下的⼏个步骤,解决了我的问题:
(1)⾸先在test plan增加了⼀个全局变量,如tid,并赋值700000(这时,就不能读取csv⾥的数据了,这⾥需要注意);(2)在beanshell前置处理器上写如下代码:这⾥的md5加密是导⼊的jar包,进⾏调⽤的
import com.xuexin.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
String tid=vars.get(\"tid\");
String m_xuexin_id = Integer.toString(Integer.parseInt(tid)+1); String examSubjectID = \"******\";
String mid_url = \"examSubjectID=\" + examSubjectID + \"&xuexinID=\" + m_xuexin_id; mymd5 mymd5 = new mymd5();
String sign_score = mymd5.getMd5(mid_url); vars.put(\"sign_score\ vars.put(\"tid\
(3)http请求,参数值处,直接读取tid和sign_score,然后tid和sign就都能读取出来并匹配了。PS:
a.传的json串⾥,包含很多个picnum,但是这个数值----程序本⾝也是随机⽣成的,所以最后⽤随机数函数⽣成picnum,这样既和服务器已有的不重复,本⾝基本上也不会重复
b.还可以⽤时间函数,每次取当前时间,这样既不相同,也不会重复,前提是这些数值服务器本⾝也是按⼀定规则⽣成的。 ⽅法⼆:
写java代码直接从本地读取csv⽂件的数据,然后导⼊jar包,通过调⽤jar包的⽅法引⽤(1)⾸先在test plan增加了2个全局变量,如i,j,并分别赋值1、0;(2)引⼊jar包,并在beanshell前置处理器上进⾏调⽤:java源码
import java.io.*; /**
* Created by New-T450 on 2017/7/20. */
public class ReadCsvData {
public static String readCSV(int row,int col){ String last = \"\"; try {
BufferedReader reader = new BufferedReader(new FileReader(\"D:\\\\scriptFile\\\\jmeter\\\\parameter\\\\yjxdata.csv\"));//换成你的⽂件名 // reader.readLine();//第⼀⾏信息,为标题信息,不⽤,如果需要,注释掉 String line = null; int index=0;
while((line=reader.readLine())!=null){
String item[] = line.split(\//CSV格式⽂件为逗号分隔符⽂件,这⾥根据逗号切分 if(index==row-1){
if(item.length>=col){
last = item[col];//这就是你要的数据了 System.out.println(last); } }
//int value = Integer.parseInt(last);//如果是数值,可以转化为数值 index++; }
return last;
} catch (Exception e) { e.printStackTrace(); return null; } } }
beanshell调⽤源码
mymd5 mymd5 = new mymd5();
ReadCsvData readdata = new ReadCsvData();
String row=(String)vars.get(\"i\"); String col=(String)vars.get(\"j\");
String tid1=readdata.readCSV(Integer.parseInt(row),Integer.parseInt(col)); vars.put(\"tid1\ log.info(\"tid1=\"+tid1);
row=Integer.parseInt(row)+1+\"\"; vars.put(\"i\ vars.put(\"j\
String examSubjectID = \"********\";
String m_xuexin_id = Integer.toString(Integer.parseInt(tid1));
String mid_url = \"examSubjectID=\" + examSubjectID + \"&xuexinID=\" + m_xuexin_id; String sign_score = mymd5.getMd5(mid_url);
vars.put(\"sign_score\
vars.put(\"examSubjectID\ vars.put(\"m_cur_version\ vars.put(\"tid1\
log.info(\"tid1=\"+m_xuexin_id+\" and sign_score=\"+sign_score);
(3)http请求,参数值处,直接读取tid1和sign_score,然后tid1和sign就都能读取出来并匹配了。PS:
a.因为需要ReadCsvData.class ⾥的⽅法返回值,所以定义⽅法时不能⽤void关键字;由于要返回last的值,所以要把last在⽅法的最前⾯进⾏声明并赋值空字符串;
b.由于java⾥传参的时候是引⽤的int类型,所以在beanshell⾥需要把字符串强转为int类型,否则就会找不到readCSV这个⽅法;
c.由于每个循环都需要i和j增加,因此⽤vars.put时,应该把row和col值赋给i、j,这样才能保证下个循环读取的数据是下⼀⾏或者下⼀列的。
2、content-type错误,导致服务器接收不到我传递的参数:
因为post的参数⾥,其中有⼀个是json串,于是我就把整个请求都当成json串往服务器传了,因此我在http请求下添加了⼀个http信息头管理器,并在管理器中添加了⼀个参数,参数名称为Content-Type,参数值为application/json;结果服务器收到的参数⼀直为空。后来找了很长时间的原因,才发现可能是多了⼀个这个,试着把它删了,运⾏后正常,没问题了。
3.json串⾥,有的参数也需要参数化,这⾥只需要把需要参数化的地⽅替换成${参数名称},然后就能读取数据了(当然前提是能有地⽅存放正确的参数值列表)。
因篇幅问题不能全部显示,请点此查看更多更全内容