在接口或性能測(cè)試中,會(huì)碰到接口的某些參數(shù)值是base64的,那就是調(diào)接口之前,得先把圖片轉(zhuǎn)換成base64。
如果只是簡(jiǎn)單的場(chǎng)景,可以事先把轉(zhuǎn)換好的base64,通過(guò)用戶自定義變量寫死一個(gè)。
但是復(fù)雜場(chǎng)景的時(shí)候,比如說(shuō)很多不同大小的圖片,大批量圖片等,為了盡量模擬實(shí)際場(chǎng)景,要求每次取不同的圖片,進(jìn)行穩(wěn)定性或性能測(cè)試。這個(gè)時(shí)候把所有圖片提前轉(zhuǎn)換,然后在存儲(chǔ),就不太方便了。
下面就來(lái)說(shuō)下用前置處理器beanshell自動(dòng)轉(zhuǎn)換圖片
用戶定義的變量
E:\jmeterjpg\
路徑后面的“\”不能省噢(如果省了,那需要在后續(xù)的beanshell里面加上,不然會(huì)找不到路徑的)
BeanShell 預(yù)處理程序-jdk8
本次作為功能演示,String b= "25k";這個(gè)目前寫死了,可以根據(jù)實(shí)際需要傳變量的
這里提供下思路哈:
1.jmeterjpg文件夾里面的圖片重命名 從1開始,遞增;
如果圖片超過(guò)100w,windows系統(tǒng)重命名會(huì)很慢的,建議在linux上直接改,改好后,在傳到windows本地;
2.通過(guò)隨機(jī)獲取或jmeter里面的計(jì)數(shù)器,作為一個(gè)變量,傳給“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
因?yàn)檗k公電腦的JDK環(huán)境是8,而家里的JDK環(huán)境是最新的13,發(fā)現(xiàn)BASE64Encoder方法在8上面是沒(méi)有問(wèn)題的,但是JDK13就會(huì)提示找不到。然后就在家里調(diào)試了下,發(fā)現(xiàn)jmeter是支持 org.apache.commons.codec.binary.Base64;這個(gè)的,于是就把執(zhí)行的代碼調(diào)整了下。這樣的話就減少了對(duì)JDK的依賴,兼容性好了很多;JDK8和JDK13 是沒(méi)有問(wèn)題的
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)試取樣器
加入一個(gè)調(diào)試取樣器,等會(huì)看下運(yùn)行結(jié)果
運(yùn)行一下,看下結(jié)果:
jdk8:
兼容jdk8和jdk13的結(jié)果: