一、Jmeter獲取當前系統時間和對系統時間加減
time | ${__time()} |
YMD | ${__time(YMD)} |
HMS | ${__time(HMS)} |
YMDHMS | ${__time(YMDHMS)} |
yyMMdd | ${__time(yyMMdd)} |
yyyy-MM-dd | ${__time(yyyy-MM-dd)} |
結果:
time=1577257801655
YMD=20191225
HMS=151001
YMDHMS=20191225-151001
yyMMdd=191225
yyyy-MM-dd=2019-12-25
H 24小時制的小時, h 12小時制的小時;
S 毫秒,s秒;
M 月份,m分鐘;
D 一年的第幾天,d一個月的第幾天。
${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成時間格式 2019-12-25 15:07:10:635
${__time(,)}:默認該公式精確到毫秒級別, 13位數 1577257727436 (毫秒)
${__time(/1000,)}:該公式精確到秒級別, 10位數 1577257727 (秒)
當前時間${__timeShift(,,,,)}
增加一天${__timeShift(,,P1d,,)}
增加一H ${__timeShift(,,PT1H,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,P1d,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT1H,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT10m,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT20S,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,P1dT1H10m20s,,)}
${__time(YMDHMS,)}
${__time(YYYYMMDHMS,)}
二、Jmeter中常見的問題
1、返回數據:
{"success":true,"result":["01","02","03","04","05","06","07","08"]}
正則表達式提取器:"result":(.+)} 取得是:["01","02","03","04","05","06","07","08"]
2、postman調用接口返回200 response返回正常 ,Jmeter返回502 查看端口號(默認8080)是否寫全還有URL(Content-type:aplication/json) utf-8等
3、接口返回405 查看請求方式是否正確
4、601 獲取token失敗
5、400請求的入參存在問題
6、415 查看請求協議是否正確 (htp/https)
7、正則提取數據庫中一列數據 itemId\n(.*)\n(.*)\n(.*)\n(.*)\n(.*) 模板:$1$$2$$3$$4$$5$
8、判斷多數值對不對(添加debug) id_g1、id_g2 是debug中用正則提取出來的數據
在Beanshell斷言中添加判斷
if(${id_g1}!=10200){
Failure = true;
FailureMessage = "不匹配";
return;
}
if(${id_g2}!=10191){
Failure = true;
FailureMessage = "不匹配";
return;
}
9、怎樣在JDBC request中執行多條一類的sql語句
在 JDBC Connection Configuration的URL中配置 ?allowMultiQueries=true
例如:
三、Jmeter連接mysql數據庫
1、下載jia包 官網:mysql-connector-java-8.0.15
登錄官方下載網址:https://dev.mysql.com/downloads/connector/
解壓縮之後
打開Jmeter-測試計劃
添加 JDBC Connection Configguration 控件
2、添加到測試計劃中
3、添加JDBC Connection Configuration 填寫數據庫信息
4、database url:jdbc:mysql://rm-bp1n333xx086yq3t4io.mysql.rds.aliyuncs.com
JDBC driver class:com.mysql.jdbc.Driver
username: dba_admin
password: 5=NBS5GDDPLQ
四、Jmeter實現高併發請求
問題:
- 線程啓動了就會直接發送測試請求:如果要模擬在一瞬間糕餅大量測試的時候,需要調高線程數量。
- 如果使用了constant throughput timer,可以模擬較長時間的併發測試,但是仍無法滿足穩定的瞬間高併發測試。
解決:
- 使用集合點
作用:阻塞線程,直到指定的線程數量到達後,再一起釋放,可以瞬間產生很大的壓力。
操作步驟:
- 添加集合點,在Jmeter裏是synchronized timer
- Number of Simulated Users to Group by
a.每集合夠多少個模擬用戶(線程)後發送一次測試請求;
b.等同於設置爲線程租中的線程數;
c.確保設置的值不大於它所在線程組包含的用戶數(線程數)。
EX:“Number of Simulated Users to Group by: 5”表示併發量是5。也就是說,Jmeter會等到5個線程都運行到此處時,這五個線程纔開始執行後面的操作,先到達的線程將會在此等候。
- Timeout in milliseconds
a.超時時間,即多少毫秒後同時釋放已集結的的線程,發送測試請求;
b.如果設置爲0,Timer將等待線程數達到了"Number of Simultaneous Users to Group"中設置的值才釋放。如果大於0,那麼如果超過Timeout in milliseconds中設置的最大等待時間(毫秒爲單位)後還沒達到"Number of Simultaneous Users to Group"中設置的值,Timer將不再等待,釋放已到達的線程。
2、設置線程組屬性
因爲現在是使用集合點來實現高併發測試,所以現在線程組屬性中就可以設置線程在較長的時間來啓動,這樣測試機器的壓力就會相對小一點;
3、添加相關請求,結果樹等,運行查看效果
通過結果樹可以看到,請求是批量執行的;
1)開始執行的腳本,觀察請求的增加數量趨勢;
或
2)對比請求的發送時間;
注意:2、Synchronizing timer 僅作用於同一個JVM中的線程。
所以,如果使用併發測試,確保"Number of Simultaneous Users to Group by"中設置的值不大於它所在線程組包含的用戶數。
(原文:Synchronizing timer blocks only within one JVM, so if using Distributed testing ensure you never set "Number of Simultaneous Users to Group by" to a value superior to the number of users of its containing Thread group considering 1 injector only)
試想:a.如果分佈式測試時,synchronizing timer作用於所有jvm,那麼jvm之間或者說監控jvm工作的部件就需要頻繁通訊,確定線程的數量及狀態等,然後集結了足夠的線程後,又要發送信號讓Jmeter來發送測試請求,中間存在延時,這樣就無法模擬更真實的高併發了,而且這個東西還會消耗測試機器的一部分性能,會給測試結果帶來負面影響;
所以暫時是隻支持控制單個jvm,如果後面有辦法解決上面那些問題後,就可以實現控制多個jvm,控制總併發量;
b.如果分佈式測試,並使用了Synchronizing timer,且設置的值是小於單個jvm的線程數量;
但是,較難確保所有jvm都在同一時間點集結了同樣數量的線程數,這樣就很難下測試結論了,因爲都不知道是多少併發下的性能表現;當然了,可以將線程的啓用時間拉長,並將超時時間延長,這樣就很可能會與同一時刻集結到足夠的線程,達到超高併發的測試;
所以,分佈式測試與Synchronizing timer一般不是同時使用的;如果非要用,則需要慎重設置相關參數;
3、如果設置Timeout in milliseconds爲0,且線程數量無法達到"Number of Simultaneous Users to Group by"中設置的值,那麼Test將無限等待,除非手動終止。
這個無法達到的情況有如下幾種:
a.設置的值大於線程數量,這樣就永遠無法達到了;
b.最後一批線程數不夠集合點數目;
五、Jmeter導入腳本時報錯原因和解決
報錯截圖:
原因:
Jmeter依賴的jar包需要放到jmeter安裝目錄下的lib目錄下
解決:
D:\Jmeter3\apache-jmeter-3.1\lib\ext(目錄)下缺少一個jra包
jar包地址:https://jmeter-plugins.org/install/Install/#Plugins-Manager-Download
六、使用jmeter問題總結
1、返回數據:
{"success":true,"result":["01","02","03","01PHEV","04","05","06","07","08"]}
正則表達式提取器:"result":(.+)} 取得是:["01","02","03","01PHEV","04","05","06","07","08"]
2、postman調用接口返回200 response返回正常 ,Jmeter返回502 查看端口是否寫全還有URL(Content-type:aplication/json) utf-8等
3、接口返回405 查看請求方式是否正確
4、601 獲取token失敗
5、400請求的入參存在問題
6、415 查看請求協議是否正確 (htp/https)
7、正則提取數據庫中一列數據 itemId\n(.*)\n(.*)\n(.*)\n(.*)\n(.*) 模板:$1$$2$$3$$4$$5$
8、判斷多數值對不對(添加debug) itemid_g1、itemid_g2 是debug中用正則提取出來的數據
在Beanshell斷言中添加判斷
if(${itemid_g1}!=10200){
Failure = true;
FailureMessage = "不匹配";
return;
}
if(${itemid_g2}!=10191){
Failure = true;
FailureMessage = "不匹配";
return;
}
9、
在 JDBC Connection Configuration的URL中配置 ?allowMultiQueries=true
例如:jdbc:mysql://rm-bp1n333xx086yq3t4io.mysql.rds.aliyuncs.com?allowMultiQueries=true