Jmeter-記一次自動化造數引發的BeanShell寫入excel實例
- 2022 年 7 月 22 日
- 筆記
- Jmeter介面自動化
一、前言
最近工作和生活說忙也忙,說不忙也不忙,但就是已經感覺很長時間沒有get新的技術技能了,就是一丟丟的那種也沒有,哈哈哈,今天就來講一下最近get到的小技能吧。
工作中,由於某個需求需要幾百條數據去驗證某個介面,肯定不能手動加啦,基於測試周期緊張,直接考慮用jmeter的循環控制器輔助實現。
二、介面背景介紹
業務說明:點擊創建按鈕,彈出創建介面,輸入必填項後,點擊確定,返回創建數據成功。
1、創建介面
就是需要用該介面創建數據,對於介面的說明如下:
1)介面請求方法:PUT
2)必傳的入參需要變數的欄位有:userCode,userId,userName,remarkid
3)其餘欄位根據實際業務,可以傳固定值
思路tip:首先要確認變數欄位,其次確認變數欄位來源,最後確認如何能獲取到變數。當前的實例中,除了remarkid,其餘3個變數欄位是從另外一個查詢介面讀取的,詳細見第2點。
2、查詢用戶介面
在創建介面,輸入用戶名稱時會調用【查詢用戶】介面,該介面返回的數據就是【創建】介面中所需要的入參欄位,返回的json格式如下:
三、Loop Controller介紹
很早之前就已經在工作上用到過這個組件,今天突然發現我居然沒有針對這個組件寫詳細的部落格,太尷尬了,那現在就簡單了解下這個組件的用法吧。
Loop Count:循環次數,分為永遠、自定義次數——勾選Forever後,自定義次數置灰不允許輸入,未勾選,則可以
按字面意思,其實它就是循環該控制器下的請求,一般跟計數器配合使用,具體根據實際場景來。
如果非常熟悉Jmeter工具的,想必也知道執行緒組也可以設置循環次數,這兩者其實可以理解為父子關係,比如循環控制器設置循環2次,執行緒組設置循環4次,則執行的結果如下: 執行緒一共循環運行了4輪,每輪會循環請求介面2次
四、方法1— Loop Controller循環調用介面
1、腳本結構如下
2、使用強大的JSON提取器,提取返回的欄位
3、用戶查詢介面返回結果如下
在察看結果樹的Debug中可以看到提取的userCode,userId,userName,其中userCode_matchNr表示匹配到的總數
4、創建介面入參使用變數值
查詢介面是提取了返回欄位的所有值,要引用變數的寫法就相當於 ${userCode_1},那總不能在入參里寫死_1吧,因為要循環創建的,得想辦法讓userCode_x,後面的_x是可以每次自增的,所以要結合counter計數器函數。
而__V就是要把它們嵌套起來,__V屬於嵌套函數,有興趣可以網上百度,如果不懂的話直接複製那串改一下變數就行。
remarkid在業務上是不允許重複的,所以這裡使用Random函數,即隨機數函數,讓它隨機生成一串數字即可。
"userCode":"${__V(userCode_${__counter(\,)},)}","userName":"${__V(username_${__counter(\,)},)}","userId":"${__V(userId_${__counter(\,)},)}","remarkid":"${__Random(1000,9000,)}"
5、循環控制器循環次數使用變數值
循環控制器中的自定義次數考慮到靈活性,使用查詢介面匹配到的總數(變數_matchNr),一共提取3個欄位,所以用其中任意欄位都行,引用格式: ${username_matchNr}
6、執行
完成以上步驟,就可以執行創建數據啦,執行結果我就不貼了。
五、方法2—Loop Controller循環調用JDBC
跟方法1的步驟是一樣的,只是方法2是通過調用jdbc request,即sql循環插入數據,這裡就不貼圖啦,具體看腳本結構,然後在jdbc里寫條insert語句,將相應欄位替換成引用變數即可。
註:執行insert,Query Type需要選擇【Prepared Update Statement】
六、方法3—BeanShell寫入excel,手動生成sql語句
1、BeanShell PostProcessor
這種其實也是通過sql插入,只不過是手動插入,在用戶查詢請求下添加BeanShell PostProcessor,腳本如下:
//指定需要寫入到哪個文件 FileWriter fs=new FileWriter("C:/Users/13710/Desktop/9000.csv",true); //創建一個字元快取輸出流 BufferedWriter out = new BufferedWriter(fs); //另一種獲取變數值的寫法 //int b = Integer.valueOf("${username_matchNr}"); //System.out.println("介面返回的總數為:"+b); for(int i=1;i<= ${username_matchNr};i++){ username= vars.get("username_"+i); userId = vars.get("userId_"+i); userCode = vars.get("userCode_"+i); out.write(username+","+userCode+","+userId); out.write(System.getProperty("line.separator")); System.out.println("輸出的值是:"+username); } out.close(); fs.close();
2、執行後自動生成.csv文件
可以看到excel里有3列,因為beanshell腳本拿到3個變數欄位寫到了excel里了
3、運用強大的excel功能生成sql語句
D4列是自己先寫一條sql哈,寫好後往下拖動就會自動生成其他的,其中需要變的均引用表格變數,格式:”&A1&”
溫馨tip:如果公式中的字元串過長,要用CONCATENATE函數
例子1(這個沒超的): =CONCATENATE(“INSERT INTO contact(name, post,id)VALUES (“&A1&”, ‘”&B1&”,”&C1&”‘);”)
例子2(分成了4個字元串,因為公式中每一個字元串都不能超過255字元):
4、將D4列直接複製到資料庫里執行即可