『動善時』JMeter基礎 — 22、JMeter中實現參數化(CSV)
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數據文件設置」組件實現參數化的示例。