5 參數化
5.1 自定義變量
線程組 --> 配置元件 --> 用戶定義的變量 可以自定義變量,通過 ${變量名} 使用
5.2 隨機函數
隨機數函數
# 生產六位數的隨機數字
${__Random(100000,999999,)}
# 生成隨機時間: 時間格式yyyy-MM-dd,開始時間,結束時間,設置時區(非必填)
${__RandomDate(yyyy:MM:dd,2030:12:31,2099:12:21,,)}
# 生成隨機字符串: 字符串長度,包含字符(支持中文,特殊字符)
${__RandomString(6,asdfghjklqwertyuiopmnbvcxz,)}
# 獲取時間戳
${__time(,time)}
加密函數
# MD5加密 明文
${__MD5(123456,)}
# Base64加密 明文
${__base64Encode(123456,)}
5.3 CSV參數化
添加配置元件–CSV數據文件配置
線程共享模式
- 所有線程:所有線程共享一份文件
- 當前線程組:線程組內所有線程共享一份文件,多個線程順序讀取文件
- 當前線程:每個線程都維護一份自己的文件,多個線程都從文件第一行開始順序讀取
遇到文件結束符再次循環:設置為True,線程會再次循環從第一行讀取數據,設置為False,則線程會讀取文件結束符
遇到文件結束符停止線程:設置為True,讀取文件結束符號時停止線程,設置為False,讀取文件結束符時不停止線程
- 遇到文件結束符再次循環 ,遇到文件結束符停止線程
- True False:一直循環讀取數據,直到線程的所有循環結束
- True True:一直循環讀取數據,直到線程的所有循環結束
- Flase True:讀取到文件結束符就停止線程
- False False:遇到文件結束符不停止線程,線程一直讀取文件結束符作為參數
線程共享模式需要配合多線程(設置線程的數量大于1以及設置循環次數使用)
- 多線程:設置線程組的線程數為n,將每個線程都會執行一遍線程組內的所有請求
- 循環:設置循環次數為n,則每個線程都會循環執行所有請求n次
6 Cookie 鑒權
參考文檔:Apache JMeter - 用戶手冊:組件參考
HTTP Cookie管理器實現Cookie自動關聯的原理
- 第一步:當Jmeter第一次請求服務器的時候,如果服務器有通過響應頭的Set-Cookie返回Cookie,那么Http Cookie管理器會保存這些Cookie的值
- 第二步:當Jmeter第二次請求服務器的時候,會自動將Cookie信息添加到請求中,從而實現Cookie關聯
實現Cookie鑒權:
-
自動關聯:使用HTTP Cookie管理器對Cookie進行自動關聯
-
手動關聯:使用正則提取器對Cookie進行提取,之后在HTTP請求頭管理器中設置Cookie請求頭
7 斷言
響應斷言
- 響應碼相等斷言
- 響應頭,響應體包含,相等斷言
JSON斷言:通過JSON Path定位響應中的字段,并驗證值是否符合預期,進行斷言
持續時間斷言:請求超過最大持續時間斷言失敗
8 跨線程–全局變量
通過正則提取器或JSON提取器提取的變量是局部變量,作用域為所在的線程組。如果需要跨線程組使用變量,需要進行下面操作。
跨線程實現變量引用
- 使用提取器將值保存為局部變量
- 通過BeanShell后置處理器將獲取的值存儲為全局屬性
# 保存局部變量為全局屬性
${__setProperty(USERNAME,${username},)}
# 引用全局屬性
${__P(USERNAME,)}
- 通過引用全局屬性的方法在其它線程組內使用全局屬性
跨線程實現Cookie關聯
- 配置JMeter全局配置文件 jmeter/bin/jmeter.properties CookieManager.save.cookies = true
- 方便調試,進行該配置后在調試取樣器可以查看Cookie的值
- 提取Cookie保存為局部變量(正則提取)
- 通過BeanShell后置處理器將獲取的cookie的值存儲為全局屬性
// __setProperty 但是設置cookie為全局屬性,在部分版本(5.1)不會解析變量
// 會直接將${custom_cookie}作為字符串存儲到屬性中
// ${__setProperty(my_cookie,${custom_cookie},)};
// 通過嵌套groovy函數實現變量解析
${__groovy(props.put("my_cookie", vars.get("custom_cookie")),)}
- 添加全局的HTTP Cookie管理器,在全局Cookie管理器中添加Cookie,cookie的值通過獲取全局屬性的方法(__P方法)獲取,同時,設置Cookie生效的域名和請求路徑
- 域:Cookie生效的域名 / 服務器 , 路徑為 / 表示所有請求都生效
9. Jmeter實現數據庫(MySQL)操作
9.1 操作步驟
- 添加數據庫驅動(驅動版本和數據庫版本要匹配 MySQL5.7 對應的驅動版本是 5.1)
- 添加配置元件:在線程組下添加配置元件/JDBC Connection Configuration
- 添加配置信息
- 創建JDBC請求
- 獲取數據
9.2 配置信息配置
- Max Number of Connections:連接池最大連接數。
- 根據需求進行配置,將最大連接數設置為并發用戶數的1.2 - 1.5倍
- 設置為0時,表示連接池的最大連接數沒有明確的限制,連接池可能會根據實際需求動態地創建新的數據庫連接(不推薦使用)
- Max Wait:獲取連接失敗,等待連接釋放的最大等待時間
- Time Between Eviction Runs:檢查并清理空閑連接的時間間隔
- Auto Commit:自動提交
- 設置為True,會在執行完SQL后自動提交事務
- 設置為False,需要手動進行事務的提交和回滾
- Transaction Isolation:事務隔離級別
- default:和連接數據庫的隔離級別保持一致(推薦)
- 是否開啟預編譯:
- 預編譯(簡單理解):數據庫優化技術,實現參數和模板分離。
- 預編譯步驟一:模板編譯:數據庫提前解析帶有占位符的SQL,生成執行計劃并緩存
- 預編譯步驟二:參數綁定:執行時只需要傳遞參數值,無需二次編譯,提升性能并且防注入
9.3 創建JDBC請求
參考文檔:Apache JMeter - 用戶手冊:組件參考
執行的SQL語句類型
補充:占位符替換和${}替換的區別(重要)
?占位符是將SQL中的占位符替換為參數,底層原理是對SQL進行預編譯生成執行計劃,之后執行時對參數進行替換,因此能有效的防止SQL注入的問題,同時,對于需要重復執行的SQL,占位符替換無需反復編譯,效率比較高
$ 替換是將引用的字符串直接拼接到SQL語句中,底層原理是將字符串直接拼接后編譯,因此存在SQL注入的安全問題。對于需要重復執行的SQL,每次都要拼接后編譯,因此效率比較低
- Select Statement:普通查詢SQL,支持使用 ${變量名稱} 進行參數化,不支持 ?占位符
- Update Statement:普通修改SQL(insert / update / delete),支持使用 ${變量名稱} 進行參數化,不支持 ?占位符
- Prepared Select Statement:預編譯查詢SQL,支持 ?占位符,不支持使用 ${變量名稱} 進行參數化
- 可以使用${}進行參數化,但是引用的變量是字符串需要手動添加引號,較為麻煩,不支持
- Prepared Update Statement:預編譯修改SQL,支持 ?占位符,不支持使用 ${變量名稱} 進行參數化
- Callable Statement:調用存儲過程,支持使用 ${變量名稱} 進行參數化,支持 ?占位符
- Commit:提交當前連接的事務,忽略SQL語句,配合
AutoCommit(false)
使用。 - Rollback:回滾當前連接的事務,忽略SQL語句,配合
AutoCommit(false)
使用。 - Autocommit(false):不提交事務。
- Autocommit(true):自動提交事務。
9.4 JDBC請求參數化
使用占位符方式進行參數化,在parameter value使用${}引用變量給占位符賦值
- 用戶自定義的變量
- 隨機函數
- CSV參數化
9.5 發送請求
發送請求
查看結果
在察看結果樹 --> 請求 --> 請求體中查看實際執行的SQL語句
在察看結果樹 --> 響應數據 – > 響應體中查看查詢結果
使用結果
添加調試取樣器,可以在取樣器的響應體中查看查詢的查詢數據
${result_username_#} 獲取當前列數據有多少行
${result_username_N} 獲取當前列數據的第N行,N超過數據返回,直接使用 ${result_username_N} 返回
10 Jmeter的命令行執行
-n 通過命令行執行jmeter腳本
-t 指定jmx文件的目錄
-l 生成jtl報告(需要使用Jmeter的察看結果樹觀看)
-e 生成html報告
-o 指定html報告的存儲路徑(必須為空目錄)生成jtl需要進行全局配置 -- 通常不使用,而是使用生成html報告
全局配置:設置輸出格式為xml,設置下面兩個屬性為true
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true# 生成jtl報告指令
jmeter -n -t test.jmx -l report.jtl生成html報告的全局配置,設置輸出格式為csv:
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true# 生成html報告指令
jmeter -n -t csv.jmx -l result.jtl -e -o reports