51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2418|回复: 1
打印 上一主题 下一主题

jmeter读取本地CSV文件

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-13 14:07:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用jmeter录制考试上传成绩等脚本时,出现的问题及解决方法如下:

1、beanshell前置处理器,不能读取本地csv文件里的数据:

方法一:

在beanshell里不能直接从本地的csv文件里读取到tid的值,幸好tid数据是有规律的,从700000开始,依次增加,
于是通过如下的几个步骤,解决了我的问题:

(1)首先在test plan增加了一个全局变量,如tid,并赋值700000(这时,就不能读取csv里的数据了,这里需
要注意);

(2)在beanshell前置处理器上写如下代码:

这里的md5加密是导入的jar包,进行调用的

  1. [java] view plain copy
  2. import com.xuexin.*;  
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5.   
  6.     String tid=vars.get("tid");  
  7.     String m_xuexin_id = Integer.toString(Integer.parseInt(tid)+1);  
  8.     String examSubjectID = "******";  
  9.     String mid_url = "examSubjectID=" + examSubjectID + "&xuexinID=" + m_xuexin_id;  
  10.     mymd5 mymd5 = new mymd5();  
  11.         String sign_score = mymd5.getMd5(mid_url);  
  12.         vars.put("sign_score",sign_score.toString());  
  13.         vars.put("tid",m_xuexin_id.toString());  
复制代码

(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源码

  1. [java] view plain copy
  2. import java.io.*;  
  3.   
  4. /**
  5. * Created by New-T450 on 2017/7/20.
  6. */  
  7. public class ReadCsvData {  
  8.   
  9.     public static String readCSV(int row,int col){  
  10.         String last = "";  
  11.         try {  
  12.             BufferedReader reader = new BufferedReader(new FileReader("D:\\scriptFile\\jmeter\\parameter\\yjxdata.csv"));//换成你的文件名  
  13.             // reader.readLine();//第一行信息,为标题信息,不用,如果需要,注释掉  
  14.             String line = null;  
  15.             int index=0;  
  16.             while((line=reader.readLine())!=null){  
  17.                 String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分  
  18.                 if(index==row-1){  
  19.                     if(item.length>=col){  
  20.                         last = item[col];//这就是你要的数据了  
  21.                         System.out.println(last);  
  22.                     }  
  23.                 }  
  24.                 //int value = Integer.parseInt(last);//如果是数值,可以转化为数值  
  25.                 index++;  
  26.             }  
  27.             return last;  
  28.               
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.             return null;  
  32.         }  
  33.   
  34.     }  
  35.   
  36. }  
  37. beanshell调用源码
  38. [java] view plain copy
  39. mymd5 mymd5 = new mymd5();  
  40. ReadCsvData readdata = new ReadCsvData();  
  41.   
  42. String row=(String)vars.get("i");  
  43. String col=(String)vars.get("j");  
  44.   
  45. String tid1=readdata.readCSV(Integer.parseInt(row),Integer.parseInt(col));  
  46. vars.put("tid1",tid1.toString());  
  47. log.info("tid1="+tid1);  
  48.   
  49. row=Integer.parseInt(row)+1+"";  
  50. vars.put("i",row);  
  51.         vars.put("j",col);  
  52.   
  53. String examSubjectID = "********";  
  54. String m_xuexin_id = Integer.toString(Integer.parseInt(tid1));  
  55. String mid_url = "examSubjectID=" + examSubjectID + "&xuexinID=" + m_xuexin_id;  
  56. String sign_score = mymd5.getMd5(mid_url);  
  57.      
  58. vars.put("sign_score",sign_score.toString());  
  59. vars.put("examSubjectID",examSubjectID.toString());  
  60. vars.put("m_cur_version",m_cur_version.toString());  
  61. vars.put("tid1",tid1.toString());  
  62. 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,参数值为ap
plication/json;结果服务器收到的参数一直为空。后来找了很长时间的原因,才发现可能是多了一个这个,
试着把它删了,运行后正常,没问题了。



3.json串里,有的参数也需要参数化,这里只需要把需要参数化的地方替换成${参数名称},然后就能读取数
据了(当然前提是能有地方存放正确的参数值列表)。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-12 21:41 , Processed in 0.060026 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表