Jmeter專輯
【源於網路搜集和個人總結,供喜歡jmeter的小夥伴分享】
最近一直在壓力測試,那我們就從jmeter講起吧(在學習之前,請重點理解http協議,理解http協議會讓你在學習過程中事半功倍!)
jmeter主要應用:介面測試,性能測試; jmeter的優點: 1)開源 2)小巧(與loadrunner比起來那可不要太爽)3)功能強大,完全滿足現有測試需求
缺點:
java語言編寫,本身性能較差,所以在編寫腳本的時候,儘可能的少用斷言,少添加監聽器,如果必須添加監聽器,請選擇只顯示錯誤的請求;
jmeter安裝:
1)打開網頁:http://jmeter.apache.org/download_jmeter.cgi 2)下載最新3.1版本,解壓到任意目錄 3)下載java的jdk進行安裝(java7後版本),注意要配環境變數 jmeter應用環境:linux,windows,Unix,在實際壓測過程中本人在linux與windows上均有實踐;jmeter元素介紹:
一:測試計劃用來描述一個性能測試的所有活動,就是說我們要做的所有性能測試活動都在此計划下,一般情況下,此處不需要我們做任何修改
二:線程組:可以看做是一個虛擬用戶同時線程組內可以在線程數里設置虛擬用戶數,後面會做講解
Ramp-up Period:這裡的意思是多久時間準備匯流排程數,如圖所示為一秒內啟動一個線程數,如果線程數為2,時間為10,則表示10秒內啟動兩個線程,5s一個;
循環次數勾選永遠,請求將會一直執行下去,這個功能挺重要的;三:測試片段:坦白講用處不大,做了那麼多性能測試,未有用到,可以理解為一個特殊的線程組,只有它是模塊控制器或者被模塊控制器引用才會被執行!(官網解釋)
四:取樣器:這是整個性能測試的核心部件,所有的http請求均填寫在此 處,主要用途為向伺服器發送請求,記錄響應信息; 五:配置元件:這樣理解就相當於我們的配置文件,主要為靜態數據提供支持,例如我需要從文件中讀取參數(添加csvdata),需要添加請求信息頭等等均在此處添加(添加http信息頭處理器)等等,此部件非常重要,需要重點理解,後期我們將做重點介紹 六:前置處理器,故名思議,在請求發出去之前對請求進行修飾,用的比較多的是URL重寫,當請求中需要sesstion時可以通過它來進行填充sesstionid; 七:定時器:此元件主要用來在請求之間添加等待時間,在測試過程中我們經常要等待上一個請求執行完成,有時需要添加等待時間,我用的比較多的是固定定時器八:後置處理器:顧名思義,在請求執行該元件,我使用的最多的是正則表達式,用於提取前一個請求的響應參數用於後一個請求的請求參數,非常重要;
九:斷言 在前面我們也有講過,斷言就是程序用來判斷響應結果與預期結果是否一致,本人用的最多的是響應斷言 十:監聽器,用於記錄響應的結果信息,在調試的時候查看結果樹用的最多,實際執行測試中聚合報告用的最多; 十一:邏輯控制器 為什麼最後才說這個呢?不是這個不重要,這個元件很重要,但是在性能測試初級階段可能比較少用到,主要用來控制邏輯,例如有if控制器,只有滿足某個條件,才執行該操作,有循環控制器,有隻運行一次控制器(常用於登錄,因為很多時候我們只需要登錄一次,然後去執行其他頁面操作,驗證該操作的性能)幾個最常用的元件--標配: 1)http信息頭管理器,請求頭內容存放在此元件中 2)線程組--虛擬用戶,可以設置用戶數3)http請求:核心,進行請求發送
4)斷言:響應斷言,程序自動判斷結果是否正確 5)監聽器--查看結果樹:收集發送請求的結果接下來,我將以獲取天氣的介面給大家講解實例:介面地址:http://toy1.weather.com.cn/search?cityname=湖南一:get請求1)http信息頭管理器:請求頭內容存放在此元件中,Referer可以記錄訪問的來源,統計訪問量,防止盜鏈,也是一種安全策略,有同學要問了,我怎麼知道這裡有Referer呢,很簡單,利用fiddler抓包你就知道了,見下圖抓包請求頭。2)線程組--虛擬用戶,通過修改虛擬用戶數達到並發用戶測試的目的
3)http請求:核心,進行請求發送
4)斷言:響應斷言,程序自動判斷結果是否正確5)監聽器--查看結果樹:收集發送請求的結果
所有元件正確設置好後點擊啟動按鈕,待執行完成後,點擊查看結果樹進行查看;最後選中測試計劃,點擊文件-->保存測試計劃為,進行腳本保存二:post請求post請求與get請求基本一致 ,但是http請求設置與信息頭處理器有區別,見以下講解:1)請求方式為POST2)請求參數填寫,可以選擇Pararmeters與Body Data任意模塊中,但是這兩個模塊功能是一樣的,兩個模塊不可同時使用,可以任意選擇其一,效果一致,填寫其中一個模塊再去填寫另外一個是會報錯的,具體參數怎麼填寫請參考之前的postman講解,類似;
3)對於post請求,因為有參數的存在,所以要注意信息頭中需填寫參數傳遞的格式。PS:介面技術文檔中怎麼要求怎麼寫,並不是所有的都是json格式;到這裡我們就能把 jmeter用起來了。資料庫測試前置條件:
1)下載jdbc驅動,以mysql為例:mysql驅動jar文件 2)任意版本的jmeter,本人為3.1版本; 3)可被連接的mysql資料庫; 注意事項,不同的資料庫驅動不同,連接設置也不一樣,本文以mysql為例;實施步驟:
1)下載jdbc驅動,放在任意目錄,我放於D盤下 2)打開jmeter,點擊測試計劃,點擊下方瀏覽按鈕,引入jdbc驅動,如圖 3)點擊測試計劃,添加資料庫連接配置元件: 4)如下圖進行連接設置:注意填寫Variable name,Database Url填寫jdbc:mysql://資料庫IP或hostname:埠號/資料庫5)在線程組下添加jdbc請求
6)進行請求設置 如果要對資料庫進行插入操作,jmeter3.1版本Query Type 請選擇update,網上很多文章是錯的; 7)添加查看結果樹,點擊運行,就可以看到從資料庫中返回的結果;到這裡我們就可以通過jmeter對資料庫進行性能測試了。集合點的位置應該在發出的請求之前
步驟:一)添加集合點二)集合點設置三)樣例http協議是無狀態協議,所謂的無狀態指的是它對於事務的處理沒有記憶能力,這就意味著如果後續的請求需要用到前面的信息,它就必須重傳,這嚴重影響應用之間的交互,因為交互基本都是承前啟後的;
以電商為例:正常登錄後,去執行下訂單操作,如果按照http無狀態協議的理解,那麼在下訂單的時候程序是不知道是否處於登錄狀態的,也就是說必須重新把登錄態傳一次,為了解決這些問題,為正常交互存儲狀態,引入了技術cokkie,而jmeter的cookie管理器就是模擬該功能。
cookie管理器的作用:保存登錄信息
首先看一個簡單的例子:登錄,然後點擊登錄後的頁面查詢按鈕,首先以不加cookie管理器看是否執行成功,然後加上cookie管理器後情況又如何;
一:不加cookie管理器1)添加登錄請求2)添加登錄後的查詢按鈕請求與查看結果樹3)點擊執行按鈕,查看結果樹 通過查看結果樹我們發現,點擊「登錄後的查詢按鈕」,請求地址發生了重定向,定向到了登錄頁(見紅色框內login字),也就是本來我該請求的地址為「1」處地址,但是實際確被定向到了「2」地址並且響應數據內我們發現有登錄,請輸入密碼字樣,也就是執行該請求時,程序認為我沒有登錄,把請求彈回登錄頁了。二:加上cookie管理器:cookie管理器可以不填寫任何信息,只要有登錄信息時cookie管理器會自動保存當前的登錄狀態;
4)點擊執行請求按鈕,再來查看結果樹,「登錄後點擊查詢按鈕」沒有被重新定向到登錄頁,相應數據處並且返回了查詢的頁面信息,說明請求被執行成功; 三:如果我們知道登錄的cokkie信息,是不是可以繞過用戶名與密碼呢?答案當然是肯定的: 1)我們知道了之所以伺服器認為我們處於登錄狀態,是因為請求頭的內容包含了登錄的cookie信息,因此我們可以從該請求去查找到cookie信息,如下圖,在請求內容我們查找到了cookie信息;2)將cookie信息填入cookie管理器3)點擊執行,再次查看結果樹發現就算不用用戶名與密碼我們也是可以登錄成功的!如下圖jmeter的信息頭處理器主要作用是用來偽造http協議的請求頭,也就是說http協議請求頭的所有內容,均可填寫在jmeter信息頭處理器中,但是http請求頭內的許多內容其實對實際請求的結果是不會有影響的(我們也根本沒必要將所有頭信息均填寫進jmeter中),接下來我將講解如何從請求頭內的眾多信息中找出會影響請求結果的信息!
首先,我們先來看下fiddler抓下來的登錄介面請求頭信息及對請求頭信息簡要分析:Host: http://paport.bwebpp.com --- 請求資源的主機與埠號,因默認為80埠因此埠號被省略;Connection: keep-alive---連接通信方式為長連接,一次通信結束後不會立刻斷開,第二次通信繼續使用該連接通道;Content-Length: 38--內容長度;Accept: application/json, text/javascript, */*; q=0.01---可接收的伺服器返回格式類型;Origin: http://paport.bwebpp.com--起始URL地址;X-Requested-With: XMLHttpRequest---請求為Ajax非同步請求;User-Agent: Mozilla/5.0 Chrome/46.0.2490.86 Safari/--瀏覽器相關信息;Content-Type: application/x-www-form-urlencoded;charset=UTF-8---文件類型與格式(這條在發送請求中很重要,往往沒有指定格式會導致請求發送不成功);Referer: http://paport.bwebpp.com/login---請求從該URL發出訪問當前頁面,一種安全策略;Accept-Encoding: gzip, deflate---接受的編碼格式;Accept-Language: zh-CN,zh;q=0.8---接受的語言;Cookie: looyu_id=ecca45c81b3d9aecc8730d434bc740---cookie信息; 對於初學者而言,在fiddler中調試是最有效直接的辦法,也是我最推薦的方法,將fiddler抓下的登錄麥子學院的請求拖拽到Composer模塊中,如下圖通過fiddler抓包,我們知道了登錄麥子學院請求的基本信息:請求方式:post介面地址:http://www.maiziedu.com/user/login/請求頭內容:見上圖傳遞參數:見上圖PS:通過fiddler抓包我們就可以知道數據如何傳遞及請求所需要的相關信息,是不是在實際工作中對於很多介面我們根本不需要問開發要介面文檔就可以進行壓測呢? 接下來我們直接在Conposer模塊內進行調試,將你認為不需要的請求頭內容進行刪除,然後點擊Execute執行按鈕,查看信息是否能發送成功,如果成功,就說明該條請求頭信息可以刪除,失敗說明該條信息需要保留,通過這種方式我們就可以進行請求頭內容篩選!(做為初學者,你需要做的是一條條請求頭過濾,最終留下請求所必不可少的頭信息,反覆練習後,你會一眼看出哪條信息是必不可少的,這是積累的過程) 如圖,我刪除請求頭內部分內容,點擊execute執行,觀察是否執行成功,通過調試發現,最終真正影響結果的只有兩條信息:大家可以自己去試試! 通過上面這些步驟,我們已經調試好腳本了,直接填入jmeter就可以了(在實際工作中,基本上所有的腳本我都是在fiddler裡面調試好,非常方便,高手都是fiddler與jmeter配合使用) 1)添加線程組 2)添加http信息頭處理器 3)添加http請求,將fiddler內的請求參數複製填入Body Data中 4)添加查看結果樹,點擊執行按鈕,發現請求執行成功,返回狀態為"success" 實例:測試環境與正式環境介面測試腳本復用; 首先分析:測試環境與正式環境腳本區別在於伺服器地址不同,因此我們需要將伺服器地址定義一個變數,在腳本編寫中,所有用到伺服器地址的地方都用變數代替,那麼當我們需要切換環境的時候,我們就可以直接將該變數的值替換成正式環境伺服器地址即可,從而達到腳本復用; 一)在測試計划下添加用戶自定義變數; 二)在需要引用變數值處填寫${變數名稱},如上圖變數名稱為host,因此引用該變數的地方用${host}進行填寫; 三)一個介面測試腳本往往涉及多個http請求,因此會在所有的http請求中都會用到${host}這個變數值 四)切換環境測試:將注釋中的測試環境地址,替換到host對應值解決 定義變數使用變數本身是很簡單的東西,但是如果能用好將事半功倍,當然定義變數不僅僅局限在測試計劃中,在配置元件中,前置或者後置處理器中都是可以的,原理也類似,只是作用域不同,大家可以自行進行測試;壓測時經常會用到一個場景:
模擬多個用戶並發登錄,這篇文章我們將以此為實例對CSV Data Set Config做講解。
CSV Data Set Config為配置文件,jmeter通過該配置文件可進行CSV文件數據讀取,並將讀取的數據在腳本中運用執行,從而達到數據與驅動相分離的目的,在實際工作中如果涉及到jmeter腳本中有變數一次性需要驗證多個值所響應的結果時優先考慮此配置文件; 一)單個用戶登錄腳本調試正常完成 二)參數化用戶名與密碼,添加CSV Data Set Config配置 元件 三)新建CSV文件,放在E盤下XingN文件夾中(放任意目錄不影響),並填寫好用戶名與密碼用逗號隔開; 四)配置CSV Data Set ConfigPS:1)Filename處寫絕對路徑+文件名稱.csv,目的是讓程序能順利找到CSV文件並讀取它 2)分隔符處可以填寫t ,CSV文件內分隔符用t隔開(鍵盤上按TAB鍵)如圖 3)Recycle on EOF 選擇True時,假如CSV文件中只有三個用戶名與密碼,但是jmeter線程被循環10次,那麼這個三個用戶名會被循環讀取,從而滿足十次登錄的目的 4)Stop thread on EOF選擇true時,假如CSV文件中只有三個用戶名與密碼,但是jmeter線程數為10,那麼當csv文件被讀取一次完成後,線程自動停止,就是說線程執行 的也只有三次 5)sharing mod:設置CSV配置文件的作用範圍,如圖為 所有線程適用 五)將參數化的名稱填入引用位置,${變數名}與CSV配置文件設置的名稱必須保持一致,如下圖紅色框內必須保持一致; 六)設置線程數為3(與用戶名密碼數量匹配)點擊執行按鈕,檢查響應結果是否與預期一致註:通過檢查發現,CSV文件中的用戶名和密碼均被讀取,並做為參數發送到伺服器,搞定!在實際工作中該配置元件應用非常廣泛,需要多練習~websocket是典型的三次握手協議,建立連接通道後具備實時通信,雙向通信的特點;
一)場景: 視頻直播授課系統:在視頻直播過程中,老師為了與學生互動,需要在講課過程中將準備好的題目推送到學生觀看視頻窗口答題,學生答題後,在教師端需要收到學生答題統計,在所有這些交互過程中,教師端與學生端都是實時接收消息的,不需要刷新頁面,因此需要用到很多websocket協議,為了驗證學生答題並發能否正確保存所有學生答案,需要做並發壓力測試;二)實施: 首先需要下載7個jar包,放在jmeter的lib下的ext目錄下,下載地址:jmeter測試websocket所需jar包(7個) - 下載頻道 - CSDN.NET 注意,不可用fiddler抓包工具進行通信請求抓取,fiddler只能抓取http協議信息,websocket協議直接打開谷歌開發者工具進行抓取(F12),網上也有一些教程通過修改fiddler腳本文件抓取websocket協議的,然而並不好用;步驟如下:
1)添加登錄請求,添加cookie管理器(裡面可不填寫任何值)與信息頭管理器: 2)找到獲取websocket的sid憑證的請求,打開谷歌開發者工具,刷新頁面,就可以發現類似於下方EIO所示的請求,在jemeter中添加該請求,通過正則表達式提取該SID,並作為下面請求的參數; 3)在你需要抓取的websocket協議的頁面打開F12(開發者工具),點擊如下圖紅色框內按鈕然後刷新頁面,選中Frames模塊,該模塊記錄websocket協議的通信內容。frames中綠色為對應的請求內容,白色則表示對應的響應內容,因此我們主要關注綠色部分,知道自己要怎樣建立連接,知道自己如何發送請求內容; 如下圖代表:發送2probe請求過去,返回了3probe請求回來,此為建立連接過程,具體見jemeter腳本。 添加websocket請求:線程組-->sampler-->websocket sampler 建立連接第一次握手: 建立連接第二次握手: 選定直播對應場次,對應直播信息,從抓包中的frame模塊中查找:答題添加查看結果樹,運行查看結果登錄的結果獲取SID結果:第一次握手:第二次握手:選定直播:答題:正常來說,我們在用單台電腦做壓測的時候,並發用戶數量最好不要超過200(並發用戶數越多,對實施壓測電腦本身的配置與當前的網路環境都是有要求的,因此並不建議在一台電腦上實施過多的用戶壓測)為了解決大並發用戶數的問題,jmeter提供了分散式壓測方案; 如下圖四台電腦:一台為控制機,三台為壓力機;注意:多台電腦必須使用同一版本的jemeter,否則有可能會出現一些莫名其妙的錯誤;1)控制機一般為自己的電腦,腳本的編寫調試在此電腦完成;2)多台壓力機,運行時控制機會將腳本發送到壓力機執行,因此並不需要將腳本拷貝到壓力機上,但是如果有CSV文件讀取數據,必須將該文件也放於壓測機同一位置,也就是控制機上CSV文件的地址必須與壓力機上文件地址位置一模一樣,否則會讀取不到數據;一)在控制機上編寫調試腳本,如圖為訪問百度二)修改控制機jmeter.properties文件,將壓力機的IP地址如圖所示填寫注意:1)jmeter3.1版本不需要加埠號2)修改jmeter.properties文件後需要重啟jmeter才會生效三)檢查配置文件修改是否生效四)實施分散式壓測:1)在壓力機上開啟jemeter.bat2)控制機開啟jmeter-server.bat3)設置腳本線程數為1,點擊遠程全部啟動4)檢查聚合報告,發現發出了四個請求,線程數為1,卻出現了四個請求,說明四台機器各發出了一個請求,同時在壓力機上可以看到運行的信息,分散式壓測調試完畢,接下來就愉快的壓測吧;推薦閱讀:
※GUI自動化測試進階:頁面對象模式
※想往web自動化方向發展,該怎麼準備?
※測試自動化為測試者帶來的6大福音
※收藏清單: 一步到位, python自動化測試工具最全資源匯總
※某測試模擬器性能優化-用vprof對Python程序性能調優
TAG:自动化测试 |