Jmeter-記一次自動化造數引發的BeanShell寫入excel實例

一、前言

  最近工作和生活說忙也忙,說不忙也不忙,但就是已經感覺很長時間沒有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列直接複製到資料庫里執行即可