在寫JMeter腳本的時候經常需要模擬一些數據,大部分情況下模擬數據一般采用“CSV Data Set Config”從CSV文件中取數據。但是使用數據文件的問題是不靈活,有多少虛擬用戶可能得準備多少測試數據。比如,某應用的用戶注冊過程需要提供手機號碼,如果采用CSV文件,需要測試1000虛擬用戶則需要準備1000個手機號碼,如果測試過程中要增加虛擬用戶數目,則需要準備更多的測試數據,這個過程比較費事。對于某些特殊的有規(guī)律的測試數據,我們可以采用動態(tài)生成測試數據的方式,比如利用本文介紹的BeanShell。
具體需求
某手機應用的用戶注冊過程需要提供手機號碼,測試場景中除了用戶注冊過程中會被用到之外,不會對手機號碼產生實際操作行為(比如發(fā)送短信等),只需要符合在數據庫中表的定義即可(11位char類型)。
實現(xiàn)
實現(xiàn)過程需要考慮不同的虛擬用戶在運行的時候不能產生相同的號碼,另外還需要考慮同一個虛擬用戶在多次循環(huán)執(zhí)行的情況下也不能產生相同的號碼。為了實現(xiàn)上述需求,我們需要有一個標識虛擬用戶的ID,以及在多次循環(huán)執(zhí)行的情況下標識的當前循環(huán)次數的值。
標識虛擬用戶可以通過JMeter的內置function - threadNum來得到,而后者可以通過JMeter提供的計數器來實現(xiàn),先來看一下我們的腳本的結構。“HTTP請求”需要拿到手機號碼發(fā)起一個測試請求,該手機號碼是從一個名為mobile的JMeter變量里取得的,而該變量是通過“BeanShell PreProcessor”處理之后保存到JMeter的變量里。
BeanShell的實現(xiàn),具體請看下面的代碼注釋。
import java.text.DecimalFormat;
String strThreadNum = "${__threadNum}"; //取得當前的虛擬用戶ID
int thNum = Integer.parseInt(strThreadNum);
String str = "${iterNO}"; //取得該虛擬用戶當前的循環(huán)次數
int i = Integer.parseInt(str);
int mobileNumLastFive = thNum * 10000 + i;
DecimalFormat df = new DecimalFormat( "0000000000" );
String fullNum = 4 + df.format(mobileNumLastFive); //格式化成4開頭的11位手機號碼
System.out.println(fullNum);
vars.put("mobile", fullNum); //將手機號碼存入名為mobile的變量,該變量可以在“HTTP請求”中用到
計數器的定義:如下圖所示,引用名稱是在BeanShell里引用的iterNO變量。
BeanShell實現(xiàn)的方式的問題在于不是很高效,為了提高效率可以采用JMeter的function來實現(xiàn),讀者可以參考這篇文章。