• 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",sign_score.toString());
             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源码

    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",tid1.toString());
        log.info("tid1="+tid1);
     
        row=Integer.parseInt(row)+1+"";
        vars.put("i",row);
             vars.put("j",col);
        
        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",sign_score.toString());
        vars.put("examSubjectID",examSubjectID.toString());
        vars.put("m_cur_version",m_cur_version.toString());
        vars.put("tid1",tid1.toString());
        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串里,有的参数也需要参数化,这里只需要把需要参数化的地方替换成${参数名称},然后就能读取数据了(当然前提是能有地方存放正确的参数值列表)。


    ---------------------
    作者:爱笑的人更可爱
    来源:CSDN
    原文:https://blog.csdn.net/kaluman/article/details/73910469
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    我是如何学习写一个操作系统(七):进程的同步与信号量
    我是如何学习写一个操作系统(六):进程的调度
    我是如何学习写一个操作系统(五):故事的高潮之进程和线程1
    我是如何学习写一个操作系统(四):操作系统之系统调用
    我是如何学习写一个操作系统(三):操作系统的启动之保护模式
    我是如何学习写一个操作系统(二):操作系统的启动之Bootloader
    我是如何学习写一个操作系统(一):开篇
    Android计量单位px,in,mm,pt,dp,dip,sp和获取屏幕尺寸与密度
    Azure自定义角色实现RBAC
    Linux两块4TB的数据磁盘创建8TB的Raid0
  • 原文地址:https://www.cnblogs.com/a00ium/p/10381145.html
Copyright © 2020-2023  润新知