在接口或性能測試中嗽测,會碰到接口的某些參數(shù)值是base64的,那就是調(diào)接口之前蓉坎,得先把圖片轉(zhuǎn)換成base64澳眷。
如果只是簡單的場景,可以事先把轉(zhuǎn)換好的base64,通過用戶自定義變量寫死一個蛉艾。
但是復雜場景的時候钳踊,比如說很多不同大小的圖片衷敌,大批量圖片等,為了盡量模擬實際場景拓瞪,要求每次取不同的圖片缴罗,進行穩(wěn)定性或性能測試。這個時候把所有圖片提前轉(zhuǎn)換祭埂,然后在存儲面氓,就不太方便了。
下面就來說下用前置處理器beanshell自動轉(zhuǎn)換圖片
用戶定義的變量
E:\jmeterjpg\
路徑后面的“\”不能省噢(如果省了蛆橡,那需要在后續(xù)的beanshell里面加上舌界,不然會找不到路徑的)
BeanShell 預處理程序-jdk8
本次作為功能演示,String b= "25k";這個目前寫死了泰演,可以根據(jù)實際需要傳變量的
這里提供下思路哈:
1.jmeterjpg文件夾里面的圖片重命名 從1開始禀横,遞增;
如果圖片超過100w粥血,windows系統(tǒng)重命名會很慢的柏锄,建議在linux上直接改,改好后复亏,在傳到windows本地趾娃;
2.通過隨機獲取或jmeter里面的計數(shù)器,作為一個變量缔御,傳給“b”
import java.io.*;
import sun.misc.*;
String a= vars.get("path");
String b= "25k";
String a =a+b+".jpg";
String base64string=null;
InputStream inputStream = null;
byte[] data = null;
try {
inputStream = new FileInputStream(a);
data = new byte[inputStream.available()];
inputStream.read(data);
BASE64Encoder encoder = new BASE64Encoder();
base64string = encoder.encode(data);
base64string = base64string.replaceAll("\n", "").replaceAll("\r", "");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
String str=base64string.toString();
vars.put("base64str",str);
圖片轉(zhuǎn)base64
因為辦公電腦的JDK環(huán)境是8抬闷,而家里的JDK環(huán)境是最新的13,發(fā)現(xiàn)BASE64Encoder方法在8上面是沒有問題的耕突,但是JDK13就會提示找不到笤成。然后就在家里調(diào)試了下,發(fā)現(xiàn)jmeter是支持 org.apache.commons.codec.binary.Base64;這個的眷茁,于是就把執(zhí)行的代碼調(diào)整了下炕泳。這樣的話就減少了對JDK的依賴,兼容性好了很多上祈;JDK8和JDK13 是沒有問題的
import java.io.*;
import org.apache.commons.codec.binary.Base64;
String a= vars.get("path");
String b= "25k";
String a =a+b+".jpg";
byte[] data = null;
try {
InputStream in = new FileInputStream(a);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Base64 base64 = new Base64();
vars.put("base64",base64.encodeToString(data));
調(diào)試取樣器
加入一個調(diào)試取樣器培遵,等會看下運行結果
運行一下,看下結果:
jdk8:
兼容jdk8和jdk13的結果: