搜索
您的当前位置:首页正文

jmeter读取本地CSV文件

来源:好走旅游网
jmeter读取本地CSV⽂件

⽤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串⾥,有的参数也需要参数化,这⾥只需要把需要参数化的地⽅替换成${参数名称},然后就能读取数据了(当然前提是能有地⽅存放正确的参数值列表)。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top