使用 Java 讀寫 JMeter 中的變數

喵喵發表於2020-07-22

1. 使用Java寫入JMeter中的變數

1.1 需求

一個專案中有很多介面,起初儲存在JMeter中配置元件->自定義變數中,如下圖:

雖然有調整順序的功能,但是量大之後,查詢維護起來還是很麻煩。

1.2思路

將這些介面資訊放在excel中統一管理,如果有調整,直接編輯excel表格,排序、檢索方便,如下圖:

1.3環境準備

JMeter:5.0

JDK:1.8

Java編輯軟體:Eclipse MARS

1.4Java程式碼實現

1.4.1讀取表格資料

現將表格中的資料讀取到程式碼中,我這裡使用的是資料儲存,大家可以按照自己的習慣來寫,由於使用的是jxl.jar讀取excel表格,所以格式必須是xls字尾的,否則無法讀取,程式碼如下:

/*輸入流,宣告讀取變數is 用於讀取excel表格*/    
InputStream is=null;

/*構建Workbook物件*/
Workbook workbook=null;

/*傳入path中描述的路徑,讀取到is中*/
is=new FileInputStream(path);

/*將is中讀取到的excel表格賦值給workbook*/
workbook=Workbook.getWorkbook(is);

/*宣告變數sheet,將workbook中的sheet名為sheetname的表格讀取到sheet中*/
Sheet sheet=workbook.getSheet("APIList");

/*宣告一個陣列,用於存放sheet中的值,長度根據sheet中的實際長度定義*/
String cases[][] = new String[sheet.getRows()][sheet.getColumns()];

/*通過兩層迴圈,將sheet中的資料讀取到陣列中*/
for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){

/*宣告一個單元格變數,通過getCell(j,i)得到單元格中的值,讀取每列每行,getCell(j,i)前面的j是列,i是行*/
Cell cellA1=sheet.getCell(j,i);

/*如果當前單元格的格式是label(文字型別)型別的,就讀取到陣列中,注意:excel中所有內容需要儲存成文字型別,包括數字*/
if (cellA1.getType().equals(CellType.LABEL)){

/*獲取string型別單元格的資料*/
cases[i][j]=cellA1.getContents();

}
}
}
//將excel表關閉
workbook.close();
//將輸入流關閉
is.close();

1.4.2儲存到JMeter變數中

將讀取出的陣列cases,迴圈讀取到JMeter變數中,程式碼如下:

JMeterVariables vars = getVariables();
for(int i=1;i<cases.length;i++){
vars.put(cases[i][0],cases[i][1]);
}

1.4.3整體程式碼

完整方法程式碼如下:

 public void import_apilist(String path) throws IOException, BiffException{

/*輸入流,宣告讀取變數is 用於讀取excel表格*/
InputStream is=null;

/*構建Workbook物件*/
Workbook workbook=null;

/*傳入filepath中描述的路徑,讀取到is中*/
is=new FileInputStream(path);

/*將is中讀取到的excel表格賦值給workbook*/
workbook=Workbook.getWorkbook(is);

/*宣告變數sheet,將workbook中的sheet名為sheetname的表格讀取到sheet中*/
Sheet sheet=workbook.getSheet("APIList");

/*宣告一個陣列,用於存放sheet中的值,長度根據sheet中的實際長度定義*/
String cases[][] = new String[sheet.getRows()][sheet.getColumns()];

/*通過兩層迴圈,將sheet中的資料讀取到陣列中*/
for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){

/*宣告一個單元格變數,通過getCell(j,i)得到單元格中的值,讀取每列每行,getCell(j,i)前面的j是列,i是行*/
Cell cellA1=sheet.getCell(j,i);

/*如果當前單元格的格式是label(文字型別)型別的,就讀取到陣列中,注意:excel中所有內容需要儲存成文字型別,包括數字*/
if (cellA1.getType().equals(CellType.LABEL)){

/*獲取string型別單元格的資料*/
cases[i][j]=cellA1.getContents();

}
}
}

//將excel表關閉
workbook.close();
//將輸入流關閉
is.close();
JMeterVariables vars = getVariables();
for(int i=1;i<cases.length;i++){
//表格中一共三列,name,values,description,所以只將name和value讀入陣列,第0列一定是name,第1列是value
vars.put(cases[i][0],cases[i][1]);
}

}

說明:excel表中一共三列,第一列介面名稱(Name),第二列介面路徑(Values),第三列介面描述(Description),格式固定好。

1.4.4匯出為jar包

寫好後,需要匯出成jar包,來提供給JMeter使用,方法如下:

右鍵需要匯出的類名,選擇Export...,選擇匯出路徑後儲存,如下圖:

1.5JMeter呼叫

在JMeter呼叫時,有兩種方法,一直接把所需要的jar包,放在JMeter目錄中\lib\ext裡面,第二是將jar包放在某個地方,在計劃中新增,如下圖:

這裡需要匯入兩個包,一個讀取excel的包:jxl.jar,另一個是上面程式碼匯出的包,importAPI.jar

在呼叫時,新增一個BeanShell Sampler,寫程式碼呼叫,程式碼如下:

import jmeterjar.*;
importAPI a= new importAPI();
a.import_apilist("E:\\work\\project\\測試\\data\\data_base.xls");

如下圖:

說明:importAPI是解除安裝jmeterjar包下面的,所以引用的時候,需要匯入包中的類,這裡使用了星號匯入了所有類,如下圖:

在檢視結果樹中檢視結果:

到此,excel中的資料,已經匯入到了JMeter中,後續請求,使用${變數名}可以呼叫。

2.讀取JMeter中的變數,提供給Java程式碼使用

反過來,使用Java讀取JMeter中的變數,也是提供了介面,具體實現如下:

2.1Java程式碼實現

public String getJmeterV(String var){
JMeterVariables vars = getVariables();
String content = vars.get(var);
return content;
}

2.2JMeter呼叫

需要將JMeter中的變數名,當成字串傳入方法,如下圖:

需要jar包請 點選下載。

相關文章