Jmeter 請求簽名api接口-BeanShell
- 項目簽名說明
- 編譯擴展jar包
- jmeter 使用 BeanShell 調用jar包中的簽名方法
項目簽名說明
有簽名算法的api接口本地不好測試,使用BeanShell 擴展jar 包對參數進行簽名,接口簽名算法使用 sha512Hex 算法。簽名的說明如下
- 請求參數類型
body 參數
原始字符串 originData
appId=appId&appKey=appKey&timeStamp=當前時間戳&body=json參數
- request 參數
原始字符串 originData
appId=appId&appKey=appKey&timeStamp=當前時間戳&key1=value1&key2=value2
key 按照升序排列
- 簽名算法
使用 sha512Hex 簽名算法
String inputData = "name=scd&address=廣東";
String encodeData = URLEncoder.encode(inputData, StandardCharsets.UTF_8.name());
String result = DigestUtil.sha512Hex(encodeData, StandardCharsets.UTF_8.name());
System.out.println(result);
originData 使用 URLEncoder.encode 編碼,避免出現中文。在使用 sha512Hex 算法計算出簽名串 sign
- 請求頭數據
sign:sign
timestamp:1701948943849
appId:xxx
項目地址
https://gitee.com/3281328128/web-jdk17/tree/dev/
啟動項目后 swagger 訪問地址
http://localhost:8080/boot3/swagger-ui/index.html
編譯擴展jar包
jmeter 支持擴展的jar包,使用BeanShell調用jar包中的方法。項目地址為https://gitee.com/3281328128/jmeter-api-sign。目前jmeter5.6.2版本支持jdk8編譯的擴展jar,之前用jdk17編譯出來的擴展jar包,不能運行簽名算法,后面改成使用jdk8編譯的jar包
引用的jar包需要帶jar-with-dependencies 結束的jar,如圖所示
如果使用 maven 編譯,將依賴編譯到jar包里面配置如下所示
<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.itsenlin.Helloworld</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- bind to the packaging phase --><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
jmeter 使用 BeanShell 調用jar包中的簽名方法
- 選擇測試計劃導航欄,配置擴展的jar
- 配置BeanShell 預處理程序
路徑 添加 -》前置處理器 -》BeanShellProcessor
BeanShell 的具體配置如下所示
使用擴展jar包中的簽名算法
import com.alibaba.fastjson.JSON;
import com.scd.sign.SignUtil;String inputParam = "{\n" +" \"id\": 0,\n" +" \"userName\": \"string\",\n" +" \"password\": \"string\"\n" +"}";
String inputJson = JSON.parseObject(inputParam).toJSONString();
log.info("request json " + inputJson);
String timeStamp = String.valueOf(System.currentTimeMillis());
String appId = bsh.args[0];
String appKey = bsh.args[1];
String sign = SignUtil.generateBodySign(appId, appKey, timeStamp, inputJson);
vars.put("body", inputJson);
vars.put("appId", appId);
vars.put("timestamp", timeStamp);
vars.put("sign", sign);
vars 中存入了原始的請求參數,http的請求的body參數需要取vars中存入的數據 ${body}
請求頭中需要的數據 appId、timestamp、sign 也可以從 vars 中獲取
BeanShell 的用法可以查看 【jmeter】BeanShell用法詳細匯總
- 配置接口響應斷言
路徑 添加 -》斷音 -》JSON斷言
- 配置查看結果樹
配置查看結果樹之后才能查看請求的記錄,配置路徑 添加 -》監聽器 -》查看結果樹
- 啟動線程組驗證
啟動之后,可以在查看結果樹查看請求記錄
點擊黃色的感嘆號,可以查看運行的日志