Jmeter工具使用的問題總結

一、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實現高併發請求

問題:

  1. 線程啓動了就會直接發送測試請求:如果要模擬在一瞬間糕餅大量測試的時候,需要調高線程數量。
  2. 如果使用了constant throughput timer,可以模擬較長時間的併發測試,但是仍無法滿足穩定的瞬間高併發測試。

解決:

  1. 使用集合點

作用:阻塞線程,直到指定的線程數量到達後,再一起釋放,可以瞬間產生很大的壓力。

操作步驟:

  1. 添加集合點,在Jmeter裏是synchronized timer
  2. Number of Simulated Users to Group by

a.每集合夠多少個模擬用戶(線程)後發送一次測試請求;

b.等同於設置爲線程租中的線程數;

c.確保設置的值不大於它所在線程組包含的用戶數(線程數)。

EX:“Number of Simulated Users to Group by: 5”表示併發量是5。也就是說,Jmeter會等到5個線程都運行到此處時,這五個線程纔開始執行後面的操作,先到達的線程將會在此等候。

  1. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章