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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM