1、引數化的定義
引數化是自動化測試指令碼的一種常用技巧,可將指令碼中的某些引數使用變數來代替。例如登入操作時,利用GET/POST請求方式傳遞引數的場景,可在指令碼執行時指定引數的取值範圍和規則。
指令碼在執行時,根據需要選取不同的引數值作為輸入,該方式稱為資料驅動測試(Data Driven Test),而引數的取值範圍被稱為資料池(Data Pool)。
2、什麼情況下需要用到引數化
測試資料的準備階段我們需要用到引數化。
使用場景:
- 若需求每次訪問某一個介面的資料不一樣時,需要用到引數化,更好地模擬使用者情況,常用於壓力測試。
- 需要多次獲取同一資料 ,則可以用一個引數化來代替,在需要的地方使用這一個變數就可以了。
3、JMeter實現引數化的方式
JMeter提供了多種引數化方式,常用的4種方式如下:
- CSV資料檔案設定(
CSV Data Set Config
):這種方式是通常所指的引數化。資料儲存在檔案中,該種引數化方式取值範圍大,靈活性強,適用於大量測試資料時的使用。 - 使用者引數(
User Parameter
):適用於引數取值範圍很小,需要少量測試資料時使用。 - 使用者自定義變數(
User Defined Variables
):更多用於設定全域性變數,常用於資料庫地址,測試環境、開發環境地址等常量配置。 - 函式助手:可使用函式生成隨機數字和隨機字串實現引數化。
在JMeter中使用引數化變數的方式:${變數名}
。
4、CSV資料檔案設定介面詳細說明
CSV資料檔案設定(CSV Data Set Config
)是一個配置元件(Config Element
),用來提供對靜態資料配置的支援,可以為取樣器提供需要的變數。
CSV資料檔案設定元件,在它所在層級的元件中是第一個執行。即在最開始被執行,在相同範圍內的任何取樣器之前執行。
CSV資料檔案設定元件能夠在檔案中讀取一行資料,根據特定的符號,切割成一個或多個變數放入記憶體中。相比於JMeter函式助手中提供的 __CSVRead()
、__StringFromFile()
等函式,CSV資料檔案設定元件使用更加簡便。
JMeter支援資料被雙引號括起,被雙引號括起的資料允許包含分隔符,例如:a,b,"c,d"
。這行資料被逗號分隔後將產生三個變數值:a
、b
、c,d
。
JMeter支援讀取具有標題行(標題行內容如Excel的列名稱)的CSV檔案。
(1)CSV資料檔案設定元件介面說明
新增CSV資料檔案設定元件的操作:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> CSV資料檔案設定
。
CSV資料檔案設定元件介面如下:
引數詳解:
- 名稱(
Name
):指令碼中顯示的該元件的描述性名稱,必須填寫。 - 註釋(
Comments
):對該元件的說明資訊。(非必填寫) - 檔名(
Filename
):待讀取檔案的名稱。可以寫入絕對路徑,也可以寫入相對路徑(相對於bin
目錄或者指令碼檔案所在目錄),如果直接寫檔名,則該檔案一定要放在bin
目錄中。對於分散式測試,主機和遠端機中相應目錄下應該有相同的CSV檔案,必須填寫。(建議填寫相對路徑,避免指令碼遷移時需要修改路徑) - 檔案編碼(
File Encoding
):檔案讀取時的編碼格式,不填則使用作業系統的編碼格式。(非必填寫,下拉選單可選,一般情況下選擇UTF-8
即可) - 變里名稱(
Variable Names
):變數名列表。對應引數檔案每列的變數名,類似Excel檔案的檔案頭,起到標示作用,同時也是後續引用的識別符號,建議採用有意義的英文標示。
例如:eid,name
可以被用變數名來引用:${eid},${name}
。
多個變數名之間必須用分隔符分隔。如果該項為空,則檔案首行會被讀取並解析為列名。(非必填寫) - 忽略首行(
Ignore first line
):是否忽略首行,如果CSV檔案中沒有表頭,則選擇False,必須填寫。 - 分隔符(
Delimiter
):引數分隔符,將一行資料分隔成多個變數,預設為逗號,也可以使用\t
。如果一行資料分隔後的所獲得的變數數,比Vairable Names
中定義的變數少,這些變數將保留以前的值(如果有值的話),必須填寫。 - 是否允許帶引號?(
Allow quoted data?
):是否允許變數使用雙引號,允許的話,變數將可以括在雙引號內,並且這些變數名可以包含分隔符。(非必填寫) - 遇到檔案結束符再次迴圈?(
Recycle on EOF?
):是否迴圈讀取CSV檔案內容,預設為 True,必須填寫。
因為CSV Data Set Config
元件一次讀入一行,分割後存入若干變數中交給一個執行緒組,如果執行緒數超過文字的記錄行數,那麼可以選擇從頭再次讀入;
1)為True時,當已讀取完引數檔案內的測試用例資料,還需繼續獲取用例資料時,此時會迴圈讀取引數檔案資料(即:讀取檔案到結尾時,再重頭讀取檔案);
2)為False時,若已至檔案末尾,則不再繼續讀取測試資料;通常在“執行緒組的執行緒數“或者”執行緒組的迴圈次數“>引數檔案組數時,選用False(即:讀取檔案到結尾時,停止讀取檔案); - 遇到檔案結束符停止執行緒?(
Stop thread on EOF?
):如果執行緒數超過了資料檔案中的變數,是否停止,預設為 False。當Recycle on EOF
為True時,此項無意義。 - 執行緒共享模式(
Sharing mode
):共享模式,即引數檔案的作用域。如果希望每個執行緒擁有自己獨立的值集合,那麼就需要建立一系列資料檔案,為每個執行緒準備一個資料檔案,如test1.csv
、test2.csv
等,使用檔案的方式test${__threadNum}.csv
,並將Sharing mode
設定為Current thread
。
1)所有執行緒All threads
(預設):檔案在所有執行緒間共享。即當前測試計劃中的所有執行緒組中的所有的執行緒都有效。
2)當前執行緒組Current thread group
:每個檔案會針對每個執行緒組開啟一次。即:對當前執行緒組中的執行緒有效。
3)當前執行緒Current thread
:每個檔案會針對每個執行緒單獨開啟。即:對當前執行緒有效。
(2)補充說明:Recycle on EOF
和Stop thread on EOF
的關係
Recycle on EOF?
:遇到檔案結束符再次迴圈?(相當於是否迴圈讀取檔案中的每組資料)
Stop thread on EOF?
:遇到檔案結束符停止執行緒?(停止執行緒的時機,看下面)
解釋:
- 當
Recycle on EOF
選擇True時,Stop thread on EOF
選擇True和False無任何意義,因為既然前面已經設定了檔案是不停的迴圈讀取,後面的控制停止執行緒就相當於失效; - 當
Recycle on EOF
選擇False時,Stop thread on EOF
選擇True,則當執行緒數超過檔案裡的引數的個數時,實際請求數為引數的個數。如果執行緒數少於引數個數,則實際請求數以設定的執行緒數為準;(此狀態也是迴圈讀取檔案中的資料) - 當
Recycle on EOF
選擇False時,Stop thread on EOF
選擇Flase,當執行緒數超過檔案裡引數的個數時,實際請求次數為執行緒數,但當執行緒數超過引數次數時,由於沒有引數,所以結果仍然是失敗的。如果執行緒數少於引數個數,則實際請求數以設定的執行緒數為準。(此狀態也是迴圈讀取檔案中的資料)
5、使用CSV資料檔案設定元件實現引數化
示例:批量實現使用者的登陸操作。
(1)測試計劃內包含的元件
新增元件操作步驟:
- 建立測試計劃。
- 建立執行緒組:
選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
。 - 在測試計劃(也可以是執行緒組)裡面新增配置元件
CSV Data Set Config
元件:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> CSV 資料檔案設定
。 - 線上程組裡面,新增取樣器“HTTP請求”元件:
選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> HTTP請求
。 - 線上程組裡面,新增監聽器“察看結果樹”元件:檢視結果,
選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹
。
最終測試計劃中的元件如下:
點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。
(2)資料檔案內容
先用Excel表格編輯所需的請求引數,內容如下:
我們需要把該檔案儲存為.csv
格式。
然後使用Notepad++
開啟該檔案,點選“編碼” —> 轉為UTF-8編碼,防止中文亂碼。
最終所得到的.csv
格式檔案的內容如下:
(3)執行緒組元件內容
如果需要使用CSV檔案中所有的資料,需要設定執行緒組元件的執行緒數或迴圈次數。
因為在CSV資料檔案設定元件中,有Recycle on EOF
和Stop thread on EOF
選項的關係,所以設定執行緒數和迴圈次數都可以實現,使用資料檔案中的每一組資料進行測試。
(4)CSV資料檔案設定元件內容
設定好的CSV資料檔案設定元件介面如下:
我一般常用操作,簡單說明:
- 檔名:就直接瀏覽選擇檔案即可,也就是使用資料檔案的絕對路徑。
- 檔案編碼選擇
UTF-8
。 - 變數名稱:就是把資料檔案的每個變數名都填寫上,中間用逗號分割。
- 忽略首行:選擇True,如果CSV檔案中首行寫的是變數名稱,選擇忽略首行。
- 分隔符:如果CSV檔案中的資料,使用的是逗號隔開,就默是預設值。如果是製表符,就用
\t
表示。 - 是否允許帶引號?:如果變數值中有引號就選擇True,沒有則預設False即可。
- 其他一般預設選擇。如果需求看上面說明中寫的很詳細,按工作中實際情況選擇。
(5)HTTP請求元件內容
編輯登入介面內容,如下圖所示:
在JMeter中使用引數化變數的格式:${變數名}
。
(6)指令碼執行結果
該測試指令碼執行結果如下圖所示:
我們可以看到資料檔案中的每個使用者都進行了登陸操作。
以上就完成了在JMeter中使用“CSV資料檔案設定”元件實現引數化的示例。