目錄
1、動態保存日志和報告
2、命令行調試腳本,動態配置屬性 例如:線程數,持續壓測時長等
3、術語回顧
4、線程組設置(加壓方式配置)
5、Jmeter壓測減少資源使用的一些建議
背景:在准備調試完測試腳本后,在命令行運行腳本
准備工作:切換到jmeter/bin 目錄下(我這里未配置jmeter的環境變量)、將腳本文件test.jmx 存放在bin目錄
執行命令: jmeter -n -t test.jmx -l res.jtl -e -o res/
-n代表noGUI運行jmeter
-t代表測試計划(test plan)
腳本名稱.jmx,要指明所在目錄,可以使用絕對路徑,也可以使用相對路徑
-l :name不能重復.jtl (.jtl),此文件名不能重復。l就是log的意思,把結果保存到這個文件中
-e :在腳本運行結束后生成html報告
-o :用於存放html報告的目錄(若指定目錄的話,目錄必須為空),支持放1個未創建的目錄在這里
1、動態保存日志和報告
方式一:動態保存日志+報告:先刪除之前同名稱已存在的文件,再運行
windows 的命令行輸入: del /s /Q 01resLogin.jtl rd /s /Q 02res jmeter -n -t 01login.jmx -l 01resLogin.jtl -e -o 02res |
Linux的操作輸入: rm 01resLogin.jtl rm -rf 02res jmeter -n -t 01login.jmx -l 01resLogin.jtl -e -o 02res |
方式二:加上變量
2.1 要先設置變量,重復執行前都需要先設置name的值
Windows cmd命名行設置變量:set name=1,再使用它
jmeter -n -t 01login.jmx -l res%name%.jtl -e -o res%name%
---------------------------------------------------------------------------------------------------------
C:\FFFF盤\測試軟件\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin>set name=2
C:\FFFF盤\測試軟件\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin>jmeter -n -t 01login.jmx -l res%name%.jtl -e -o res%name
2.2 拿時間戳當變量,帶時間:20220402144124
window的拼接時間: %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
jmeter -n -t 01login.jmx -l res%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
.jtl -e -o res%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
2.1 Linux的先設置變量,重復執行前都需要先設置name的值 n=1 jmeter -n -t 01login.jmx -l res${n}.jtl -e -o ress${n} n=2 jmeter -n -t 01login.jmx -l res${n}.jtl -e -o ress${n}
2.2 變量就是時間戳 Linux獲取當前時間戳 $(date “+%Y%m%d%H%M%S”) jmeter -n -t login.jmx -l res$(date “+%Y%m%d%H%M%S”).jtl -e -o res$(date “+%Y%m%d%H%M%S”)
|
2、命令行調試腳本,動態配置屬性 例如:線程數,持續壓測時長等
參照:https://www.cnblogs.com/jxial/p/15169803.html
-J加上腳本設置的變量名=N,例如線程數的變量名是concurrent_number(在腳本中參數化寫法:${__P(count_number,1)} 用到了__P()函數來獲取命令中指定的屬性值,默認值是1),在命令行指定10個線程數:-Jconcurrent_number=10 (位置放在腳本文件后面)
jmeter -n -t 01login.jmx -Jconcurrent_number=10 -l 01resLogin.jtl -e -o 02res
若有多個變量,分別指派值,例如:循環次數為5 -Jcycles=5
jmeter -n -t 01login.jmx -Jconcurrent_number=10 -Jcycles=5 -l 01resLogin.jtl -e -o 02res
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="FUSE Pro APP VN" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循環控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <intProp name="LoopController.loops">-1</intProp> </elementProp> <stringProp name="ThreadGroup.num_threads">${__P(count_number,1)}</stringProp> <stringProp name="ThreadGroup.ramp_time">${__P(ini_time,1)}</stringProp> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">${__P(timePeriod,3)}</stringProp> <stringProp name="ThreadGroup.delay"></stringProp> <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> </ThreadGroup> |
-------------------------------------------------------------------------------------------
其他說明:
如果jmeter的bin目錄加入到了環境變量里面,那么在任何目錄都可以使用jmeter命令來運行jmeter程序
如果沒有的話,就切換到jmeter/bin目錄下運行。
其實,在實際壓測的時候是較少使用命令行方式的,因為看不到tps波動情況。
一般來說,如果有大的波動,是需要立即連接服務器查看各個資源的情況的,比如線程池、連接池,
雖然命令行執行完后會生成jtl結果文件,但是壓測完,壓測過程中創建的各種連接都釋放了,也就無法定位到問題了,
如果有失敗的請求還好點,這樣可以根據錯誤日志來分析定位問題。
Jmeter腳本:基本不用錄制的,參考接口文檔寫,或通過fiddler抓包
Jmeter執行順序:配置元件 → 前置處理器 → 定時器 → 取樣器 → 后置處理器 → 斷言 → 監聽器;
---------------------------------
3、術語回顧
並發:tps
線程數:跑道里參加賽跑的人數
迭代(jmeter中叫做循環次數):每個人跑多少圈
循環(jmeter中是循環控制器):一次迭代里面,反復執行其中一段腳本,就是反復來回跑其中一段跑道
參數值:發請求時候用的數據
參數化:是一種策略,可以根據參數策略獲取參數值,參考:https://www.cnblogs.com/uncleyong/p/10702700.html
思考時間:模擬用戶等待的時間
關聯:下一個請求入參依賴上一個請求的某個返回值,參考:https://www.cnblogs.com/uncleyong/p/10702702.html
檢查點:判斷請求是否成功,一般只有查詢請求才加檢查點
固定定時器:相當於模擬用戶的思考時間
集合點:集合策略,集合線程數小於等於線程組設置的線程數,還可以設置超時時間,同一時刻去發起請求,主要應用場景是秒殺
事務: 一般把被測的某個或者某幾個請求一起定義為一個事務,是人為的測試定義
負載:服務器的繁忙程度,如果一個8c的服務器,每次可以同時處理8個請求,如果請求量大,后面的請求就排隊,排隊的請求越多,服務器的負載就越高
平均響應時間(art):每個事務的處理時間,從發送請求到接收到響應
tps:每秒處理的事務數(和qps:https://www.cnblogs.com/uncleyong/p/11059556.html)(一個事務是指事務內第一個請求發送到接收到最后一個請求的響應的過程)
QPS:Queries Per Second,意思是每秒查詢率,是一台服務器每秒能夠響應的查詢次數(數據庫中的每秒執行查詢sql的次數),是數據庫中的概念,每秒執行條數(查詢),被引申到壓測中來了,但是不包括插入、更新、刪除操作,所以不建議用qps來描述系統整體的性能,不建議用qps來作為系統性能指標
每秒點擊率(數):每秒處理的請求數,而不是用戶每秒發送的請求數
場景:設置並發策略,模擬用戶使用的場景
分析:場景運行完,生成各種維度的結果
------------------------------
4、線程組設置(加壓方式配置)
在指定的時間內啟動線程,如果線程數是100,這里是10,表示10秒內啟動100線程,但是不一定是每秒啟動10個線程
循環次數:不勾選永遠,后面的次數生效;
調度器配置
循環次數中勾選永遠,持續時間就是並發的時間,一般10-15分鍾,根據業務實際情況來設置
如果循環計數不是-1或不是永遠,同時配置了調度器-持續時間,只要達到其中1個最小條件,就會結束運行。。
If Loop Count is not -1 or Forever, duration will be min(Duration, Loop Count * iteration duration),因此如果未勾選永遠,建議不要勾選調度器和設置持續時間
----------------------------------------
5、Jmeter壓測減少資源使用的一些建議,即壓測結果會更准確
1、使用非GUI模式(也就是CLI,Command Line Interface,命令行界面):jmeter -n -t test.jmx -l result.jtl
2、少使用Listener, 如果使用-l參數,它們都可以被刪除或禁用
3、在加載測試期間不要使用“查看結果樹”或“用表格查看結果”監聽器,只能在腳本階段使用它們來調試腳本
4、包含控制器在這里沒有幫助,因為它將文件中的所有測試元素添加到測試計划中
5、不要使用功能模式
6、使用CSV輸出而不是XML
7、只保存你需要的數據
8、盡可能少地使用斷言
9、如果測試需要大量數據,尤其是需要將其隨機化,可以提前准備好測試數據放到數據文件中,從CSV數據集中讀取, 這樣可以避免在運行時浪費資源