JMeter


1.常用壓力測試工具對比
a. loadrunner
  性能穩定、壓測結果及細粒大,可以自定義腳本進行壓測,但是太過於重大、功能比較繁多(國企或專業的測試團隊)
b. apache ab(單接口壓測最方便,傳統互聯網公司)
  模擬多線程並發請求,ab命令對發出負載計算機要求很低,既不會占用太多的內存,但是卻會給目標服務器造成巨大的負載,簡單DDOS攻擊等
c. webbench
  webbench首先fork出多個子進程,每個子進程都循環做web訪問測試,子進程把訪問的結果pipe告訴父進程,父進程做最終的統計結果.

 

2.Jmeter基本介紹和使用場景
a.Ability to load and performance test many different applications/server/protocol types:
  Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
  SOAP / REST Webservices
  FTP
  Database via JDBC
  LDAP
  Message-oriented middleware (MOM) via JMS
  Mail - SMTP(S), POP3(S) and IMAP(S)
  Native commands or shell scripts
  TCP
  Java Objects

b.使用場景及優點
  功能測試
  壓力測試
  分布式壓力測試
  純java開發
  上手容易、高性能
  提供測試數據分析
  各種報表數據圖形展示

 

3. 本地快速安裝jmeter4.x
簡介: GUI圖形界面的安裝
a.安裝x-windows

yum groupinstall 'X Window System' -y
yum groupinstall "GNOME Desktop" -y //要開啟3D
systemctl set-default multi-user.target //設置成命令模式
systemctl set-default graphical.target //設置成圖形模式
startx

CentOS 7 切換圖形界面和文本界面
https://www.ifshow.com/centos-7-switching-graphical-and-text-interface/

b. 需要安裝jdk8,9 或10(不建議單獨安裝jre)

[root@node2 ~]# cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/home/jdk1.8.0_152
export PATH=$JAVA_HOME/bin:$PATH

c.安裝jmeter

[root@node2 ~]# wget http://mirrors.hust.edu.cn/apache//jmeter/binaries/apache-jmeter-4.0.tgz
[root@node2 ~]# tar xf apache-jmeter-4.0.tgz 
[root@node2 ~]# cd apache-jmeter-4.0/bin
[root@node2 bin]# ./jmeter

d. 設置Jmeter環境變量

[root@node2 ~]# cat /etc/profile.d/jmeter.sh
export JMETER=/root/apache-jmeter-4.0
export CLASSPATH=$JMETER/lib/ext/ApacheJMeter_core.jar:$JMETER/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER/bin/:$PATH
[root@node2 ~]# source /etc/profile.d/jmeter.sh
[root@node2 ~]# jmeter -v



Linux下運行Java項目時,出現No X11 DISPLAY variable was set, but this program performed an operation which requires it.的問題解決
在~/.bashrc環境變量文件最下方加入:
export DISPLAY=:0.0
然后,刷新環境變量以使其生效:
source ~/.bashrc

  

4. jmeter目錄文件

[root@node2 apache-jmeter-4.0]# ll
bin 執行文件、包含配置
windows: jmeter.bat
linux: jmeter
jmeter-server:分布式壓測啟動文件
jmeter.properties: 核心配置文件

extras 插件拓展
lib 核心依賴包
junit 單元測試包

  

5.Jmeter語言版本中英文切換
a. 控制台修改 menu --> options --> choose language(臨時悠)
b. 配置文件修改(永久)
bin目錄 --> jmeter.properties(默認是#language=en,修改為language=zh)

 

6.使用SpringBoot 2.0快速編寫API測試接口
描述:使用java的框架springBoot快速編寫幾個API接口測試
http://spring.io/guides/gs/spring-boot/
接口列表:
  a. 模擬GET請求,用戶列表接口
  b. 模擬POST請求,用戶登錄接口
http://localhost:8080/users

7.創建Jmeter測試計划,快速壓測一個接口
a.創建一個測試計划

  teat plan --> add --> threads(users) --> setup Thread Group
  Name: 10 threads
  Number os threads: 10 線程數
  ramp-up period(in seconds): 10 (10秒)
  loop count: 1 循環次數
線程數: 虛擬用戶數, 一個虛擬用戶占用一個進程或線程(模擬多少個用戶請求)
准備時長(Ramp-Up Period(in seconds))
全部線程啟動時長,比如100個線程,20秒,則表示20秒內100個線程都要啟動完成,每秒啟動5個線程
循環次數:每個線程發送的次數,假如值為5,100個線程,則會發送500次,可以勾選永遠循環
右上角的00:00:00 是壓測的執行時間(壓測計划所消耗的時間)
右上角的嘆號是日志
0/0 是並發的一個數量

 

b.創建一個請求
10 threads --> add --> sampler --> HTTP Request
  protocol: 默認是http(可寫https)
  server Name or ip: 127.0.0.1
  method: get #可以使用Post,path:/login, 輸入賬號密碼parameters: name,password , include equals
  port: 8080
  path: /users
  名稱:采樣器名稱
  注釋:對這個采樣器的描述
web服務器:
默認協議是http
默認端口是80
服務器名稱或Ip: 請求的目標服務器名稱或IP地址
路徑:服務器URL
Use multipart/from-data for HTTP POST: 當發送POST請求時,使用use multipart/from-data方法發送,默認不選中
follow redirects: 有些返回302重定向
use keepalive: 保持連接

c.創建一個查看結果樹(發送請求對應的結果)
10 threads --> add --> listener --> view results tree

summary
分析:可以同時調用登錄和用戶信息接口,實現接口的聯動性

 

8.Jmeter的斷言基本使用
jmeter中有個元件叫做斷言(Assertion),它的作用和loadrunner中的檢查點類似;
用於檢查測試中得到的響應數據等是否符合預期,用以保證性能測試過程中的數據交互與預期一致。
使用斷言的目的:在request的返回層面增加一層判斷機制;因為request成功了,並不代表結果一定正確。
http requests --> add --> assertions --> response assertion
  name: include 200
  apply to : main sample only(一個接口觸發一個請求,如果一個接口聯動其他選main sample and sub-samples)
  field test(要測試的響應字段,發一個請求過去,會有請求頭,相關的響應信息)
  text response(響應文本): 返回的信息
  response code: http代碼,如200
  document: 如一些pdf,這個斷言比較消耗性能



Pattern Matching Rules(匹配規則)
  contains: 包含的范圍,如包含jack這個字段
  matches: 匹配不區分大小寫
  equals: 區分大小寫
  substring: 子字符串

Pattern to test: 如add --> 200 匹配200
custom failuer message: 失敗返回的信息

查看結果樹中: text可以雙擊對應的報錯,可以通過響應代碼、響應信息等等共同來判斷
每個sample下面可以加單獨樹,然后同時加多個斷言,最外層可以加結果樹進行匯總

 

9.Jmeter實戰之壓測結果聚合報告分析
描述:聚合報告是辱沒結果時,會有響應時間,請求大小,吞吐量等
http request --> add --> listener --> aggregate report
  label: sample的名稱
  samples: 總共發送的請求數,如10個用戶循環10次,也就是100
  average: 平均響應時間,單位是毫秒
  median: 平均時間中位數(大多數用戶的一個響應時間),有時隨着負載升得越來越高,它的中位數會變
  90%line: 90%用戶的響應時間不會越過這個值如54毫秒
  95%line: 95%用戶的響應時間不會越過這個值如368毫秒
  99%line: 99%用戶的響應時間不會越過這個值如504毫秒
  min: 最小響應時間如3毫秒
  max: 最大響應時間如438毫秒
  error%:
  throughput: 每秒請求數,類似於qps,qps不能長時,基本上是瓶頸,並長上升時,會下降
  received KB/s: 接收的字節數
  sent KB/s: 發送的字節數

 

10.Jmeter壓測腳本JMX講解

測試計划
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
    </TestPlan>

線程組
      <SetupThreadGroup guiclass="SetupThreadGroupGui" testclass="SetupThreadGroup" testname="user_api" enabled="true">
      </SetupThreadGroup>
測試名稱
        testname="user_api"
循環次數
         <stringProp name="LoopController.loops">2</stringProp>
並發數(模擬用戶數)
        <stringProp name="ThreadGroup.num_threads">30</stringProp>
並發時間
        <stringProp name="ThreadGroup.ramp_time">5</stringProp>

http request
          <stringProp name="HTTPSampler.domain">172.16.100.8</stringProp>
          <stringProp name="HTTPSampler.port">80</stringProp>
          <stringProp name="HTTPSampler.protocol"></stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          
響應斷言
          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
             <stringProp name="49586">200</stringProp>
            <stringProp name="Assertion.custom_message"></stringProp>  #失敗后的信息
            <intProp name="Assertion.test_type">1</intProp>   #test_type對應類型,如包含、匹配等

結果樹
          <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">

聚合報告
          <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="User Aggregate Report" enabled="true">

  

11.Jmeter用戶自定義變量實戰
使用原因:很多變量在全局中都有使用,或者測試數據更改,可以在一處定義,四處使用,如服務器
a. 線程組 --> add --> config element(配置條件) --> user definde variable(用戶定義的變量)
b. 引用方式$(XXX),在接口中變量使用,在path中也可以使用
c. 原始查看結果和非原生查看(基礎按鈕)
注意:只執行某一個時,threads組 --> 右擊start(導航的三角是執行所有的)

 

 

12. Jmeter實戰之CSV可變參數壓測
描述:壓力測試時,不會單用戶去測試,參數要不段的變化,如果緩存命中就沒意義,CSV就是解決這個問題,可以通過讀取文本中很多用戶數據
a. 線程組 --> add --> config elemnet(配置原件) --> CSV data set config(CSV數據文件設置)

[root@node1 ~]# cat user_info.txt  #csv一般以空格 
user11|pwd11
user22|pwd22
user33|pwd33
選項
filename: csv文件
file encoding: 是否編碼
variable names: 變量名稱,是引用時${}的名稱
sharing mode: all threads(變量是否在所有場景中引用)
delimiter: 使用的分隔符,如使用txt時可以使用" |  “分隔

b.CSV文件多參數使用

 

 

13. 壓測實戰之JDBC request壓測Mysql
a.添加線程組:test plan --> add --> threads(user) --> threads group(setup and teardown作為前置后后置處理)
b. thread group --> add --> sampler --> jdbc request
c. jar 包添加 mysql-connector-java-5.1.30.jar (可以在test plan最下處加add directory or jar to classpath)

d.JDBC connection Configuration配置
JDBC request --> add --> config element --> JDBC connection configuration
注:variable name bound to pool要與jdbc request中的一致
核心配置
  Max number of connection:最大連接數(mysql一般是3000-4000)
  MAX wait : 最大等待時間
  Auto Commit: 是否自動提交事務

DataBase URL: 數據庫連接地址 jdbc:mysql://172.16.100.8:3306/blog
JDBC Driver Class: 數據庫驅動,選擇對應的mysql
username: 數據庫用戶名
password: 數據庫密碼

 

 

14.實戰之request壓測Mysql, select語句
a. debug sampler使用(調試采樣器)
thread group --> add --> sampler --> debug sampler (variable names sql and result variables names)
在view result tree中的debug sampler中的respone data中的name_#是對應以下handle results

b.參數(sql結尾不要加';')
  - variable name of pool declared in JDBC connection configuration(和配置文件同名)
  - Query Type 查詢類型
  - parameter values 參數值
  - parameter types 參數類型
  - variable names sql 執行結果變量名 #這兩個參數主要用於debug sampler
  - result variable names 所有結果當做一個對象存儲
  - query timeouts 查詢超時時間
  - handle results 處理結果集

Query type
select statement 查詢語句
update statement 更新語句
callable statement 存儲過程
prepared select statement 預編譯的查詢語句,查詢時可能有?,防止sql注入
prepared update statement
commit 事務提交
rollback
autocommit(false)

debug sampler

 

15. 分布式壓測介紹
- 普通壓測試: 單台機可以對目標機器產生壓力比較小,並發數特別高時,受限因素包括CPU、網絡、IO等
- 分布式壓測試: 利用多台機器向目標機器產生壓力,模擬幾萬用戶並發訪問
注:在網站安全,API接口要做一個DDOS的流量閥值的限制,每個Ip限制訪問次數

原理
- 總控制機器的節點master(修改remote_host配置),其他產生壓力的機器叫"肉雞" server(機器要在同一個網段,且安裝相應的Jdk,使用RMI通訊)

[root@node2 ~]# grep remote_hosts apache-jmeter-4.0/bin/jmeter.properties 
remote_hosts=172.16.100.100:1109,172.16.100.101:1109,172.16.100.102:1109

- master會把壓測腳本送到server上面
- 執行時,其他節點server上只需要把jmeter-server打開,不用啟動jmeter
- 結束后,server會把壓測數據回傳給master,然后master匯總輸出報告

配置准備
三個角色:master slave target(master控制slave向target進行壓測,slave再收集信息返回給master)

壓力測試注意事項
  - 系統上的防火牆被關閉或正確的端口被打開
  - 所有的客戶端都在同一個子網上
  - 如果使用192.x.x.x或10.x.x.x IP地址,則服務器位於同一子網中,如果服務器不使用192.xx或10.xx的IP地址,則不會有任何問題
  - 確保jmeter可以訪問服務
  - 確保所有系統上使用相同版本的Jmeter和java,混合版本將無法正常工作
  - 您已經為RMI設置SSL或將其禁用

阿里雲jmeter壓測常見問題處理
a.there is insufficient memory for th java runtime environment to continue(當啟動jmeter-server時,內存不足)

分析:內存低,減小應用啟動的JVM內存
vim jmeter
"${HEAP:="-Xms124m -Xmx124m -XX:MAXMetaspaceSize=256m"}"  #把1g修改成124m,第一個是初始的堆內存,第二個是最大的堆內存,第三個是原數據最大的保存區域

b. rmi_keystore.jks(no such file or directory) 是jmeter遠程調用時需要一個rmi的密鑰

解決:禁用SSL,在jmeter.property中server.rmi.ssl.diable 改為 true,表示禁用

c. server failed to start: java rmi.remoteexception: cannot start. unable to get local host ip address

vim /etc/hosts
ip   機器名

d.master機器啟動后會拷貝jmx文件到slave機器, 所以不要在每台slave上傳一wwvjmx,只需要在master上有一份即可,

如果使用csv進行參數化,則需要把參數文件在每台slave上拷貝一份且路徑需要設置成一樣的
總樣本數 = 線程數 * 循環次數 * 執行機總數

e.連接失敗原因排查
  - jmeter-server是否啟動
  - 是否聯網
  - ping 服務器IP是否暢通
  - telnet Ip port
  - 檢查服務器的防火牆是否關閉
  - 雲上的策略是否正常

f.could not find apachejmeter_core.jar

解決:在agent機器上安裝jdk,並設置環境變量

g.bad call to remote host

解決:檢查控制機器上的Jmeter-server有沒啟動,或者remte_hosts是否配置正確

  

分布式壓力測試操作
a.在master上添加slave節點,修改jmeter.properties(修改完后重新啟動)

[root@node2 ~]# vim apache-jmeter-4.0/bin/jmeter.properties
remote_hosts=192.168.201.123:8899,192.168.201.125:8899
server_port=8899
erver.rmi.ssl.disable=true   #禁用ssl

b.配置slaves

vim apache-jmeter-4.0/bin/jmeter.properties
remote_hosts=127.0.0.1
server_port=8899
erver.rmi.ssl.disable=true 

c.先啟動slaves(關閉防火牆或開通相關端口)

./jmeter-server  (成功后顯示:created remote object)

d. 在master遠程執行測試

- 制作測試計划
- run --> remote start/remote stop

e. 使用命令行遠程壓力測試(-r遠程)
jmeter -n -t linus_users_api.jmx -r -l result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport

 

16. springboot打包,並使用Jar包方式部署
描述:使用圖形界面比較消耗性能

打包:mvn package && java -jar target/gs-spring-boot-0.1.0.jar & (G:\jmeter\資料\阿里雲部署jar包)
      nohup java -jar gs-spring-boot-0.1.0.jar &
訪問:http://192.168.201.8:8080/users

  

17.Jmeter非GUI界面
參數: https://jmeter.apache.org/usermanual/get-started.html

-h 幫助
-n 非GUI模式(GUI模式下比較消耗性能)
-t 指定要運行的jmeter測試腳本文件
-l 記錄結果文件,每次運行之前(要確保之前沒有運行過,即xxx.jtl不存在,不然報錯)
-r jmeter.properties文件中指定所有遠程服務器
-e 在腳本運行結束后生成html報告
-o 用於存放html報告的目錄(目錄要為空,不然報錯)
jmeter -n -t linus_users_api.jmx -l result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport

[root@node2 ~]# jmeter -n -t jmx/user_api.jmx -l result.jtl -e -o jmx/report/
Creating summariser <summary>
Created the tree successfully using jmx/user_api.jmx
Starting the test @ Thu Jun 07 13:40:09 CST 2018 (1528350009144)
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary =  12000 in 00:00:17 =  687.2/s Avg:   290 Min:     0 Max:  3435 Err:     0 (0.00%)
Tidying up ...    @ Thu Jun 07 13:40:27 CST 2018 (1528350027503)
... end of run

壓測實戰之jtl文件生成和查看
threads group --> add --> listener --> summary report

 

18.Jmeter壓測接口的性能優化
  - 使用非GUI模式,jmeter -n -t test.jmx -l result.jtl
  - 少使用listener,如果使用-l參數,它們都可以被刪除或禁用
  - 在加載測試期間不要使用“查看結果樹”或“查看結果”表監聽器,只能在調試階段使用它們來測試腳本
  - 包含控制器在這里沒有幫助,因為它將文件中的所有測試元素添加到測試計划中
  - 不要使用功能模式,使用CSV輸出而不是XML
  - 只保存你需要的數據,盡可能少地使用斷言
  - 如果測試需要大量數據,可以提前准備好測試數據放到數據文件中,以CSV READ方式讀取
  - 用內網壓測,減少其他帶寬壓測結果
  - 如果壓測大流量,盡量用多幾個節點以非GUI模式向服務器施壓

 

19.Jmeter壓測生成多維度圖形化HTML測試報告

[root@node2 ~]# jmeter -n -t jmx/user_api.jmx -l result.jtl -e -o jmx/report/
[root@node2 ~]# cd jmx/report/
[root@node2 report]# ll
total 28
drwxr-xr-x. 5 root root    40 Jun  7 13:40 content
-rw-r--r--. 1 root root  8986 Jun  7 13:40 index.html
-rw-r--r--. 1 root root 15437 Jun  7 13:40 README.TXT
drwxr-xr-x. 5 root root    89 Jun  7 13:40 sbadmin2-1.0.7

Jmeter圖形化HTML壓測報告dashboard
a. test and report information
  - source file: jtl文件名
  - start time: 壓測開始時間
  - end time: 壓測結束時間
  - filter for display: 過濾器
  - lable: sampler采樣名稱

b. APDESX(application performance index)
apdex: 應用程序性能指標,范圍在0-1之間,1表示達到所有用戶均滿意
T(Toleration threshold): 可接受閥值
F(Frustration threshold):失敗閥值

c. requests summary
- ok: 成功率
- ko: 失敗率

d. statistics 統計數據(核心數據)
  - lable: sampler采樣器名稱
  - samples: 請求總數,並發數*循環次數
  - KO: 失敗次數
  - Error: 失敗率
  - Average: 平均響應時間
  - Min: 最小響應時間
  - Max: 最大響應時間
  - 90th pct: 90%的用戶響應時間不會超過這個值(關注這個就可以,因為95%與99%是有極端值的)
  如2ms,3ms,4,5,2,6,8,8,3,9,先把整個響應時間排序,90%從小到大,還有10%最大的去掉,如去掉9,然后90%用戶都不會超過8
  - 95th pct: 95%的用戶響應時間不會超過這個值
  - 99th pct: 99%的用戶響應時間不會超過這個值(存在極端值)
  throughtput: request per second吞吐量 qps

  received:每秒從服務器接收的數據量
  send:每秒發送的數據量

Jmeter圖形化HTML壓測報告Charts
a. over time(隨着時間的變化)
  - response time over time: 響應時間變化趨勢(一般開頭都比較高)
  - response time percentiles over time(successful response) : 最大、最小
  - active threads over time: 並發用戶數趨勢(從0開始增長都設置的並發數)
  - bytes throughput over time: 每秒接收和請求字節數變化,藍色表示發送,黃色表示接收(從開始慢慢增長)
  - latencies over time: 平均響應延時趨勢
  - connect time over time: 連接消耗時間趨勢(如tcp等三次握手時間)

b.thoughput
  - hits per second(excluding embedded resources): 每秒點擊次數
  - codes per second (excluding embedded resources): 每秒狀態碼數量
  - transactions per second : 每秒事務數,tps , 如轉賬會涉及事務
  - response time vs request: 響應時間和請求數對比
  - latency vs request: 延遲時間和請求數對比

c. response times
  - response time percentiles: 響應時間百分比
  - response time overview: 響應時間概述
  - time vs threads: 活躍線程數和響應時間
  - response time distribution: 響應時間分布圖

 

20.利用JMeter的錄制功能對Web網頁進行壓力測試
  - 新生成一個Test Plan,為它新增一個Thread Group。為這個Thread Group
  - 新建一個錄制模板
  - 配置http test script recorder
  - 設置瀏覽器代理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM