目錄
- 一、概述
- 二、Jmeter運行環境
- 三、Jmeter下載與啓動
- 四、Jmeter簡單使用
- 五、JMeter元件簡單瞭解
- 1、配置元件(config Element)
- 2、前置處理器(Per Processors)
- 3、定時器(Timer)
- 4、取樣器(Sample)
- 5、後置處理器(Post Processors)
- 6、斷言(Assertions)
- 7、監聽器(Listener)
- 8、邏輯控制器
- 9、工作臺
- 六、JMeter參數化
- 六、Jmeter測試FTP請求
- 七、Jmeter測試數據庫
- 八、Jmeter斷言設置
- 九、Requests庫
- 十、聚合報告
- 十一、分佈式壓測
- 十二、Linux下操作jmeter
一、概述
1、性能測試
(1)概念
模擬多種正常、峯值以及異常負載條件來對系統的各項性能指標進行測試
- 峯值:客戶指定指標數值或者場景需求數值,如:CPU使用80%以內,登錄3秒內,佔用內存空間40%
- 負載:用戶(一個、多個)向服務器發送請求
驗證軟件系統是否滿足業務需求場景,主要焦點是業務場景的滿足(時間,空間)
(2)分類
- 負載測試:通過逐步增加系統負載,測試系統性能的變化,並最終確定在滿足系統性能指標的情況下,系統所能承受的最大負載量的測試。
通過逐步加壓的方式來確定系統的處理能力,確定系統能夠承受的各項閥值(關注的某一具體值)
逐步增加負載,在滿足性能指標的情況下,測試系統的最大負載值
- 壓力測試:通過逐步增加系統負載,測試系統性能的變化,並最終確定什麼條件下系統性能處於【失效】狀態。
逐步增加負載,使系統的某些資源達到飽和甚至失效。
- 併發測試:多用戶同時訪問同一個應用
- 目的:測試應用服務器【指定功能】的同時訪問數是否達到預期指標
併發測試需要配合集合點(同步虛擬用戶,恰好在同一時刻執行任務)來使用- 集合點: 用來聚集虛擬用戶的,在controller中可以對集合點觸發條件進行設置,當虛擬用戶到達集合點後會停止接下來要進行的操作,直到滿足集合點的觸發條件,此時在集合點上的用戶同時開始操作相同的動作,也就形成了所謂的“併發”。
- 簡而言之就是可以設置併發數
- 穩定性測試:通過給系統加載一定的業務壓力(如,CPU資源在70%~80%的使用率)的情況下,運行一段時間,檢查系統是否穩定
通常穩定性測試持續一段時間即可(1、3、7天)
(3)常用指標:
- 吞吐量
- 概念:ThroughPut,是指單位時間內,處理的客戶端請求數量,直接體現軟件系統的性能承載能力。
- 業務角度:可以是用“業務數/h”、“業務數/d”、“訪問人。數/d”、“頁面訪問量/d”來衡量。
- 網絡角度:可以用“字節數/h”、“字節數/d”等來衡量。
- 併發數
- 概念:Concurrency,是指多個同時發生的業務操作。
(100個用戶同時點擊“登錄”按鈕)- 併發性測試描述的是多個客戶端同時向服務器發出請求,考察服務器端承受能力的一種測試。
- 響應時間
- 概念:用戶從客戶端發起一個請求開始,到客戶端接收得到從服務器端返回結果整個過程所消耗的時間。
- 點擊數
1.它是衡量Web服務器處理能力的一個重要指標。 他的統計是客戶端向Web服務器發送了多少次HTTP請求來計算的。
2.點擊數通常不是一般認爲的訪問一個頁面就是一次點擊數,點擊數是該頁面所包含的元素 (如:圖片、鏈接等)想Web服務器發出的請求數量。
3. 通常我們也用“每秒點擊次數(HTTP Per Second)”來衡量Web服務器的處理能力
- 資源利用率
1.是指系統各種資源的使用情況,一般用 “資源的使用量/總的資源可用量x100%”來形成資源利用率的數據
2.通常沒有特殊需求的話 a:建議CPU不高於80% b:內存不高於80% c:磁盤不高於90%
- 錯誤率
1.是指在負載的情況下,失敗的概率。
2.不同系統對失敗率要求不同,但是一般不超過千分之五(0.5%) 穩定性較好的系統,其錯誤率應該由超時引起,即爲超時率。
2、接口測試
(1)接口
- API(Application Program Interface):屬於一種操作系統或程序接口
- GUI(Graphic User Interface):屬於一種圖形操作系統
- 兩者都屬於直接用戶接口,有時公司會將API作爲其公共開放系統
- 公司制定自己的系統接口,當共需要執行系統整合、自定義和程序應用等操作時,公司所有成員都可以通過該接口標準調用源代碼,該接口標準被稱之爲開放式API
(2)接口測試
- 測試系統組件間接口
- 主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點
(3)適用環境
- 一般應用於多系統間交互開發
- 適用於爲其他其他系統提供服務的底層框架系統和中心服務系統
- 適用於一個上層系統中的服務接口
- 平臺越複雜,系統越龐大,接口測試效果越明顯
接口測試可以發現很多在頁面上操作發現不了的bug 可以檢查系統的的異常處理能力 可以檢查系統的安全性、穩定性 前端任意改變,接口測試通過,後端無需改變
(4)要點
- 檢查數據的交換
- 傳遞和控制管理過程
- 以及系統間的相互邏輯依賴關係
接口測試就是通過測試不同情況下的輸入參數與之相應的輸出參數信息來判斷接口是否滿足或符合相應的功能性、安全性要求
(5)接口文檔
- 接口說明
- 調用URL
- 請求方法(Post/Get)
- 請求參數、參數類型、請求參數說明
- 返回參數說明
V2EX社區API:https://www.v2ex.com/p/7v9TEc53 百度翻譯接口文檔:http://api.fanyi.baidu.com/api/trans/product/apidoc 京東聯盟開放平臺:https://union.jd.com/openplatform/api 支付寶支付api:https://docs.open.alipay.com/api 騰訊開放平臺:https://wiki.open.qq.com/wiki/API%E5%88%97%E8%A1%A8
2、常見性能測試工具
(1)LoudRunner
性能穩定,壓測結果以及細粒度大,可以自定義腳本進行壓測,但是屬於重量級軟件,功能比較繁多
(2)Apache ab
單接口壓測比較方便,可以模擬多線程併發請求,ab命令對發出負載的計算機要求很低,既不會佔用很多CPU,也不會佔用太多內容,但卻會給目標服務器造成巨大的負載,簡單DDOS攻擊等。
(3)WebBench
webbench首先可以fork出多個子進程,每個子進程都循環做web訪問測試。子進程把訪問的結果通過pipe告訴父進程,父進程做最終的統計。
(4)Jmeter
- 簡單介紹
是Apache公司使用Java語言開發的用於對Web應用壓力測試的工具,後來擴展到其他領域。
像RESTClient和Postman這樣的測試工具在面對大規模、高併發的測試場景來說,很難應付。比如一個更新請求執行100次,同時模擬50個用戶請求數據。
- 作用領域
接口測試、性能測試(內)、壓力測試(外)、web自動化測試、數據庫測試
- 優點
開源、免費;支持多協議(HTTP、HTTPS、FTP、FTPS);小巧方便;功能強大;高效
- 缺點
不支持IP欺騙(某接口訪問一定量次數會出現收費的情況);不支持前端測試,無法驗證JS程序和頁面UI,必須要與Selenium配合完成Web2.0應用測試
二、Jmeter運行環境
1、JDK
- 概念:Java開發工具包,供程序員使用,包含JRE和JVM
- 下載地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html
2、JRE
概念:Java程序運行環境,包含JVM和JVM運行所需要的資源
3、JVM
概念:Java虛擬機(Java實現跨平臺的關鍵)
三、Jmeter下載與啓動
1、下載
2、啓動
進入Jmeter解壓目錄的bin目錄
啓動方式1:bin/Apachejmeter.jar 雙擊運行
啓動範式2:jmeter.bat windows下的啓動程序
jmeter.sh linux下的啓動程序
3、Jmeter目錄結構介紹
(1)Bin目錄
存放可執行文件和配置文件
- jmeter.bat :windows系統中JMeter的啓動文件
- ApacheJMeter.jar :java環境下JMeter的啓動文件
- jmeter.sh:linux系統中JMeter啓動文件
- jmeter.properties:系統配置文件
- jmeter-server.bat:windows分佈式測試要用到的服務器配置文件
- jmeter-server:linux分佈式測試要用到的服務器配置
(2)Docs目錄
是JMeter的JavaDoc,可打開api/index.html頁面來查看
例如file:///D:/Sets/apache-jmeter-5.2.1/apache-jmeter-5.2.1/docs/api/index.htmlf
(3)Printable_docs目錄
printable_docs 的usermanual子目錄下的內容是JMeter的用戶手冊文檔,其中usermanual文件中component_reference.html是最常用的核心元件的幫助文檔
(4)Lib目錄
存儲了JMeter整個功能插件,核心的依賴包
4、Other
(1) 進程
每個正在運行的應用程序,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。
(2) 線程
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。
線程就是按照進程的指令執行指定的代碼模塊。
(2) 線程組
多線程的組合
- 併發執行:多個線程同時執行(並不一定同時結束)
- 順序執行:按照線程的啓動順序挨個執行
四、Jmeter簡單使用
1、Test Plan:測試計劃
- 測試所需要的所有“組件”都是基於“測試計劃”添加、設置與執行的
- 組件:完成指定功能代碼段的封裝
(1)新建
方式一:
方式二:
(1)編輯
2、Threads(user):線程組
- 用於添加測試中使用的大多數組件
- setUp特殊線程組,測試計劃運行結束之前首先執行,一般用於初始化操作,加載程序主體執行所需的資源。
- tearDown特殊線程,測試計劃運行結束之後才執行,一般用於收尾工作,保存程序數據。
- 線程組:用於創建和實現測試計劃場景
(1)新建
方式一:右鍵單擊“測試計劃”
方式二:
(2)編輯
3、HTTP請求
- 模擬前端或者第三方軟件向服務器發送請求,並設置請求時的方法和參數數據。
(1)新建
鼠標右鍵單擊線程組
(2)編輯
3、察看結果樹
- 可以查看請求服務器時的請求信息、服務器響應數據,記錄信息到指定文件
(1)新建
(2)查看與編輯
五、JMeter元件簡單瞭解
1、配置元件(config Element)
- CSV數據文件設置(CSV Data Set Config)
- HTTP請求默認值
- HTTP信息頭管理器
用於添加腳本的各種請求
爲測試人員可以選擇測試協議
2、前置處理器(Per Processors)
- 用戶參數
用於處理項目中關於HTTP協議頭
數據庫連接處理程序
3、定時器(Timer)
- Synchronizing Timer
用於控制腳本運行時間和時長
4、取樣器(Sample)
- HTTP請求
- JDBC Request
- 調試取樣器(Debug Sampler)
5、後置處理器(Post Processors)
- 正則表達式提取器
- XPath提取器(XPath Extractor)
- XPath2提取器
腳本運行後,對返回值的處理設置
6、斷言(Assertions)
- 響應斷言
7、監聽器(Listener)
- 察看結果樹
- 聚合報告
- 斷言結果
對測試過程和結果的監控
8、邏輯控制器
- 如果(if)控制器
- ForEach控制器
- 循環控制器
9、工作臺
用於查案和管理測試腳本的基本屬性信息
六、JMeter參數化
1、參數化
- 由於做批量化操作時,數據中鍵所對應的值都是寫死的,每次只能手動改寫,而且手寫無法便捷的進行大量的數據操作。所以參數化後用程序代替人工,可以大大提高效率。
- 變量代替常量的過程
- 概念:根據需求動態獲取數據並進行賦值的過程。
2、參數化方式
- CSV數據文件設置
- 用戶參數
- 用戶自定義的變量
- 函數
3、CSV數據文件設置
(1)介紹
概念:一種從外部讀取數據功能的組件
過程:
A、設置線程組循環次數
B、CSV數據文件配置-從預先設置好的文檔中讀取變量配置
C、HTTP請求:BodyData填寫JSON報文並設置請求方。法如:POSTD、參數化引用的數據格式:{name}
E、設置HTTP信息頭管理器。
(2)參數配置
(3)請求頭信息管理器
4、用戶自動以變量
(1)創建(局部變量)
(2)創建
記得每次做出修改後,保存
(3)使用
(4)創建全局變量
N、實例
(1)通過“CSV數據文件設置”參數化
- 注意:分隔符
(2)通過函數助手參數化
- 打開
我的jmeter由於分辨率的原因,中間函數參數區域無法正常顯示,下面的是網圖
- 配置:用生成的代碼代替請求的字符串的位置
注意:在點擊“生成(Generate&……)”按鈕後,The result of ……文本框中出現值,則說明配置正確
- 修改請求參數
六、Jmeter測試FTP請求
1、發送FTP請求
- FTP是一種文件傳輸協議
- FTP服務器是一個專門提供文件上傳和下載功能的系統
- 服務器端口:21
- 服務
- 發送數據端口:20
(1)設置FTP默認請求(缺省值)
設置
- FTP服務器名或者IP
(2)FTP上傳設置
在“默認請求”中,已經設置過了的參數,這裏就不需要再進性設置
-
本地
- 本地文件內容
- 本地文件地址
-
上傳方式
-
用戶名
-
密碼
(3)FTP下載設置
- 遠程
- 遠程文件地址
- 獲取方式
- 用戶名
- 密碼
默認下載到Jmeter的bin目錄下
七、Jmeter測試數據庫
將需要對應版本的Java連接MySQL的驅動放入Jmeter的lib目錄下
1、創建JDBC配置
(1)示例
2、創建JDBC請求
- 注意:參數類型必須是varchar
3、創建JDBC預編譯請求
- 注意:請求的參數爲多個時,參數中間用英文逗號隔開
- 參數類型也是
- 還有:SQL語句後面 不要加分號 “;”
(1)示例
2、察看結果樹
八、Jmeter斷言設置
1、添加斷言
-
斷言是針對請求的,一般的斷言都隸屬於一個請求
-
一般設置響應斷言,用來驗證服務器是否反悔了必要的信息
-
注意:用的較多的是響應文本和響應代碼,不推薦使用文檔設置斷言,特別耗性能
- 匹配:不區分大小寫
- 相等:區分大小寫
- 運行腳本,查看斷言的執行情況
- 或者單獨設置錯誤的斷言信息,用於驗證
2、示例以及結果
九、Requests庫
1、工具和腳本的區別
- 工具靈活性差,更加靈活
- 工具操作簡單,腳本需要一定編程能力
- 工具適用於單一的接口測試,腳本更適用於業務連續的接
2、Requests庫簡介
- 中文幫助文檔:http://2.python-requests.org/zh_CN/latest/
- 它是Python中唯一的一個非轉基因的HTTP庫,人類可以安全享用
3、安裝
- win:
pip install requests
或者easy_install requests
- win(如果是Python3,上面的方法不成功):
pip3 install requests
- linux:
sudo pip install requests
4、Requests使用
(1)示例
def re_test():
re = requests.get("http://www.baidu.com")
te_text = re.status_code
print(te_text)
re_test()
(2)常用方法
- requests.request():構造一個請求,支持以下分鐘方法
- requests.get():獲取HTML主要方法
- requests.head():獲取HTML頭部信息的主要方法
- requests.post():向HTML網頁提交post請求的方法
- requests.put():向HTML網頁提交put請求的方法
- requests.patch():向HTML提交局部修改的請求
- requests.delete():向HTML提交刪除請求
(3)Get請求
- 無參
def re_test():
re = requests.get("https://www.v2ex.com/api/topics/hot.json")
print(type(re))
te_text = re.status_code
print("---------")
print(te_text)
print("---------")
print(type(re.text))
print("---------")
print(re.cookies)
print("---------")
print(re.content) # 二進制
print("---------")
print(type(re.content)) # 二進制
print("---------")
print(re.encoding) # 二進制
print("---------")
print(re.content.decode("utf-8"))
# re_test()
- 有參
def re_test_n():
url = "https://www.v2ex.com/api/nodes/show.json"
data = {
"name": "Python",
"name":"Linux"
}
response = requests.get(url=url, data=data)
print(response.status_code)
re_test_n()
(3)Post請求+格式轉換
提供了兩種裝換成Json格式的方法
url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
header = {
'appCode': 'A292AA84EFADB138DC632C2D93984B34',
'appKey': 'AKID95336308872a6e3c475614e1afadc40a',
'appSecret': '1231af1bf535ca373b59d5b04d4a4a39'
}
data = {
'pri_id': 'ne',
'v_pic': st
}
re = requests.post(url, data=data, headers=header)
print(rejson()["title"])
print(json.loads(re.text)["title"])
十、聚合報告
1、創建
2、查看
- 樣本(Samples):總共測試用例請求數
- 平均值(Average):平均響應時間(ms)
- 中位數(Median):50%請求響應時間的中間數值(ms)
- 90%:90%請求的響應時間7762ms
- 95%:95%請求的響應時間9687ms
- 99%:99%請求的響應時間14386ms
- 最小值(Min):最小響應時間
- 最大值(Maximum):最大響應時間
- 異常(Error%):本次測試中出現的錯誤率,錯誤的請求的數量/請求的總數
- 吞吐量(Throughput):默認情況下表示每秒完成的請求數
- 接收(Received KB/src):從服務器端接收到的數據量kb/s
- 發送(Sent KB/src):從客戶端發送的請求的數量kb/s
3、查看運行日誌
十一、分佈式壓測
1、介紹
- 普通壓測:單臺機可以對目標機產生的壓力比較小,受限因素包括CPU、網絡、IO等
- 分佈式壓測:利用多臺機器向目標機器產生壓力,模擬幾萬用戶併發訪問
2、原理
jmeter分佈式壓測原理
大多用Linux做服務的原因是GUI圖形化界面比較耗性能
-
總控機器的節點master,其他產生壓力的機器叫“肉雞”server
-
master會把壓測腳本發送到server上面
-
執行的時候,server上只需要把jmeter-server打開就可以了,不用啓動jmeter
-
結束後,server會把壓測數據傳回master,然後master彙總輸出報告
-
master和肉雞最好是同一個網段
-
mvn package && java -jar 路徑
-
linux守護進程:nohup java -jar 名稱 &
-
ssh root@IP
十二、Linux下操作jmeter
- master:司令
- slaves:奴隸
- target:目標
- 注意關閉防火牆:service iptables stop
- RMI設置SSL或者將其禁用
- 遠程拷貝(內網):scp -r 文件路徑 root@IP:目標機器目錄
- 啓動:./jmeter-server 或者 nohup ./jmeter-server &
- 壓測要用內網IP,公網會限制貸款
1、部署
- wget 網址
2、操作
- -h:幫助
- -n:非GUI模式
- -l(L):記錄結果的文件,每次運行之間要確保沒有運行過,即xxx.jtl不存在,否則會報錯
- -t:指定要運行的 jmeter 測試腳本文件
- -r:jmeter.properties文件中指定的所在遠程服務器
- -e:在腳本運行結束後生成HTML報告
- -o:用於存放HTML報告的目錄(目錄不能爲空,否則會報錯)
- jmeter -n -t 測試計劃名 -l 文件名 -e -o 路徑
例子:jmeter -n -t HTTP_test.jmx -l result.jtl -e -o /user/local/test/ResultReport
1、日誌出現:of run 爲壓測結束
2、壓測結果存在在設置目錄的index.html文件中
3、可視化圖形報告分析
(1)Dashboard核心指標
- A:Test and Report informathion
- Source File:jtl文件名
- Start Time:壓測開始時間
- End Time:壓測結束時間
- Filter for Display :過濾器
- Label:sample採樣器名稱
- B:APDEX(Application Performance Index)
- apdex:應用程序性能指標,範圍在0~1之間,1表示達到所有用戶均滿意
- T(Toleration Threshold):可接受閥值
- F(Frustration THreshold):失敗閥值
- C:Requests Summary
- OK:成功率
- KO:失敗率
- D:Statistics 統計數據
- label:sampler採樣器名稱
- samples:請求總數,併發數*循環次數
- KO:失敗次數
- Error%:失敗率
- Average:平均響應時間
- Min:最短響應時間
- Max:最長響應時間
- 90th pct:90%對的用戶響應時間不會超過xx
- 95th pct:95%對的用戶響應時間不會超過xx
- 99th pct:99%對的用戶響應時間不會超過xx(存在極端值)
- Throughput:Request per Second 吞吐量 qps
(2)Chart
- A:Over Time (隨着時間的變化)
- Response Times Over Time:響應時間變化趨勢
- Response Time Percentile Over Time(Successful response):最大、最小、平均,用戶響應時間分佈
- Active Threads Over Time:併發用戶趨勢
- Bytes Throughput Over Time:每秒接收和請求字節數變化,藍色表示發送,紫色接受
- Latencies Time Over Time:平均響應時間趨勢
- Connect Time Over Time:連接耗時變化趨勢
- B:Throughput
- Hits Second(excluding embedded resource):每秒狀態碼數量
- Codes Per Second(excluding embedded resource):即TPS,每秒事務數
- Response Time VS Request:響應時間和請求數對比
- Latency VS Request:延遲時間和請求數對比
- C:Response Times
- Response Time Percentiles:響應時間百分比
- Response Time Overview:響應時間概述
- Time VS Threads:活躍線程數和響應時間
- Response Time Distribution:響應時間分佈圖
3、錯誤解決
(1)
- 一、
- 二、解決
- bin目錄中輸入
- 修改初始堆內存、最大堆內存
(2)
- 一、
- 二、解決
(3)
- 一、
- 二、
3、實測
(1)指標
(2)修改配置
jmeter.properties中remote_hosts中slave的IP地址和端口號
remote_ hosts=192. 168.0.102: 8899, 192.168.0.101 :8899