項目背景
-
待壓測的業務依賴前置業務的response
-
前置業務不在壓測范圍內
-
前置業務的response格式大致如下:
{"data": "[id1, id2, id3...]"}
-
待壓測業務每次請求消耗一個id,同時希望能把每次用到的id記錄下來
實現方案
-
既然前置業務能一次性返回所需的id,那在setUp線程組中完成准備測試數據即可
-
使用BeanShell實現寫入文件的操作,考慮一下3點:
① 寫入到文件中的格式要能參數化給待測業務用
② id不可重復使用,那就要求文件中的內容每次都是新的id,即舊文件要刪除
③ 雖然前置業務返回的是JSON,但考慮到Java處理JSON要依賴第3方jar包,腳本移植不方便,就直接操作字符串吧
具體細節
-
在setUp線程組中新建前置業務的Sampler和JSON Extractor
-
在Sampler下繼續添加后置處理器BeanShell
import java.io.*; var idFile = "data/id.csv"; // 定義存放id的文件路徑 try{ File f = new File(idFile); f.delete(); // 刪除舊的idFile文件 }catch(Exception e){ e.printStackTrace(); } var idStr = vars.get("data"); // 獲取JSON Extractor中提取的data idStr = idStr.replace("[",""); // 去掉 "[id1, id2, id3...]" 首尾的中括號 idStr = idStr.replace("]",""); String[] temp = idStr.split(","); // 以"," 分割字符串 "id1, id2, id3...",保存成String類型的數組 FileWriter fstream = new FileWriter(idFile); //FileWriter("file01.txt",true) 追加模式 BufferedWriter out = new BufferedWriter(fstream); for (int i = 0; i < temp.length; i++){ out.write(temp[i]); out.write(System.getProperty("line.separator")); // 換行 } out.close(); fstream.close();
-
接下來就可以在待測業務的線程組中新建【CSV數據文件設置】
- 注意這里有個坑,就是JMeter腳本在執行時,會先檢查csv文件是否存在,不存在會報錯,所以需要先手動創建一個“id.csv”在data目錄下,有無內容無所謂,主要為了檢查通過