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列直接複製到數據庫裏執行即可

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章