互聯(lián)網(wǎng)壓力性能Badboy.Jmeter
http://itopic.org/jmeter-http-tcp.html
使用JMeter錄制手機App腳本
](https://testerhome.com/uploads/photo/2017/2a131cd8-a9ac-4103-aa0b-932f26d71e19.png!large)
備注:本人不太喜歡用Jmeter的錄制功能崭篡,因為會錄制很多無效的網(wǎng)絡(luò)請求挪哄,但若不知道接口參數(shù)的情況下,可以采用錄制方式琉闪,然后刪除修改迹炼。
線程組的設(shè)置
普通線程組1、 線程數(shù):設(shè)置并發(fā)用戶線程數(shù)量,即通常意義的并發(fā)用戶數(shù)2斯入、 Ramp-Up Period (in seconds):設(shè)置并發(fā)用戶加載時間砂碉,假設(shè)并發(fā)用戶數(shù)設(shè)置為100,此處設(shè)置為10刻两,則認(rèn)為jmeter會在10s內(nèi)加載完成100并發(fā)用戶數(shù)增蹭,也就是說每隔10秒加載一個3、 循環(huán)次數(shù):輸入框與復(fù)選框只能選擇一種磅摹,不能同時被選擇為場景循環(huán)方式沪铭;輸入框輸入數(shù)字則被認(rèn)為是當(dāng)前線程組所控制的腳本區(qū)域的執(zhí)行次數(shù);【永遠】復(fù)選框選擇后偏瓤,輸入框內(nèi)的數(shù)字將失效杀怠,啟動后腳本將一直執(zhí)行下去。4厅克、 調(diào)度器:對于調(diào)度而言赔退,顧名思義就是我們想在什么時間開始運行,運行多長時間自動停止諸如此類的場景需求均可以在此設(shè)置证舟∷镀欤 ? 啟動時間:在設(shè)置時間點開始運行場景,比如你想在下班后開始運行女责,如果時間小于當(dāng)前時間漆枚,啟動后立即執(zhí)行,大于當(dāng)前時間抵知,啟動后等待本地時間到了自動運行 ? 結(jié)束時間:在設(shè)置時間點結(jié)束運行場景墙基,比如上班前結(jié)束運行,結(jié)束時間如果小于開始時間或者當(dāng)前時間刷喜,自動運行后立即終止 ? 持續(xù)時間:設(shè)置當(dāng)前場景持續(xù)運行的時間 ? 啟動延遲:設(shè)置場景啟動后多長時間再開始真正運行残制,比如你想在下班后5分鐘開始運行場景其中持續(xù)時間和啟動延遲的優(yōu)先級高于啟動時間和結(jié)束時間,也就是說當(dāng)你設(shè)置了持續(xù)時間或者啟動延遲掖疮,那么你的啟動時間或者結(jié)束時間將失效初茶,5、 幾種設(shè)置場景組合: ? 不勾選【永遠】浊闪,選擇【調(diào)度器】恼布,設(shè)置完成后,啟動運行也只會運行當(dāng)前并發(fā)用戶數(shù)循環(huán)次數(shù)搁宾,運行完成即會結(jié)束折汞。所以此中選擇可用于希望未來某時間點開始運行完成并發(fā)用戶數(shù)循環(huán)次數(shù)的場景 ? 勾選【永遠】,設(shè)置啟動時間及結(jié)束時間猛铅,持續(xù)時間和啟動延遲均為空字支,可用于希望未來某時間點自動運行并且到未來某時間點自動結(jié)束的場景 ? 勾選【永遠】, 設(shè)置 持續(xù)時間和啟動延遲, 可用于希望在啟動多久后自動運行并持續(xù)多長時間的場景
另外介紹一個調(diào)試工具Debug Sampler堕伪,會把我們自定義的變量輸出在response data中揖庄,方便我們調(diào)試的時候使用,但在正式執(zhí)行腳本時需要刪除Debug Sample[
](https://testerhome.com/uploads/photo/2017/e1e8d832-6d0e-466b-9c3d-1eead591b061.png!large)
jp@gc - Stepping Thread Group
[
](https://testerhome.com/uploads/photo/2017/a59940a0-c7da-4bfd-8c76-8a4b72b9cb35.png!large)類似loadrunner的場景設(shè)置欠雌,解釋:? This Group will start 100 threads:這次的測試總共會起100個線程蹄梢。? First , wait for 0 seconds:等待0s后開始起線程,也就是不等待直接起線程富俄。? Then start 10 threads every 30 seconds:每起10個線程后會運行30s禁炒,再起余下的10個線程,再運行30s霍比,以此類推幕袱。? Using ramp-up 5 seconds:前面每起多少個線程的時候花5s,與上面結(jié)合起來即5s內(nèi)起10個線程悠瞬,運行30s们豌,然后再再5s內(nèi)再起10個線程,再運行30s浅妆,以此類推望迎。? Then hold load for 60 seconds. :全部的線程起來后,運行60s 后開始停止(跟loadrunner類似凌外,從jmeter聚合報告里面可以看出來辩尊,這里的hold load 的意思,其實是這些線程康辑,一直在請求摄欲,相當(dāng)于jmeter普通線程組里面的循環(huán)運行)。? Finally , stop 5 threads every 1 seconds:最后停止線程晾捏,5個線程停一次蒿涎,等1s再停5個線程(當(dāng)然哀托,第一次是hold時間一過就先停5個線程惦辛,然后等1s再停余下的5個線程)。
介紹幾個常用的邏輯控制器
JMeter中的Logic Controller分為兩類:a) 控制測試計劃執(zhí)行過程中節(jié)點的邏輯執(zhí)行順序仓手,如:循環(huán)控制器(Loop Controller)胖齐、if控制器(If Controller)等;b) 對測試計劃中的腳本進行分組嗽冒、方便JMeter統(tǒng)計執(zhí)行結(jié)果以及進行腳本的運行時控制等呀伙,如:吞吐量控制器(Throughput Controller)、事務(wù)控制器(Transaction Controller)添坊。一剿另、ForEach控制器(ForEach Controller) 作用:ForEach控制器一般和用戶自定義變量一起使用,其在用戶自定義變量中讀取一系列相關(guān)的變量。該控制器下的采樣器或控制器都會被執(zhí)行一次或多次雨女,每次讀取不同的變量值谚攒。二、包含控制器(Include Controller) 作用:用于引用外部的Jmx文件氛堕;從而控制多個測試計劃組合三馏臭、事務(wù)控制器(Transaction Controller) 作用: 事務(wù)控制器會生產(chǎn)一個額外的采樣器,用來統(tǒng)計該控制器子結(jié)點的所有時間讼稚。四括儒、僅一次控制器(Once Only Controller) 作用:在測試計劃執(zhí)行期間,該控制器下的子結(jié)點對每個線程只執(zhí)行一次锐想,登錄場景經(jīng)常會使用到這個控制器帮寻。五、吞吐量控制器(Throughput Controller) 作用:控制其下的子節(jié)點的執(zhí)行次數(shù)與負載比例分配赠摇,也有兩種方式: Total Executions:設(shè)置運行次數(shù) Percent Executions:設(shè)置運行比例(1~100之間规婆,不用寫%) 如:設(shè)置線程組循環(huán)5次,吞吐量控制器1:百分比40蝉稳,吞吐量控制器2:百分比60[
](https://testerhome.com/uploads/photo/2017/2345227d-9435-47c0-9680-efe544dae85b.png!large)
六抒蚜、If 控制器(If Controller) 作用:根據(jù)給定表達式的值決定是否執(zhí)行該節(jié)點下的子節(jié)點,默認(rèn)使用javascript的語法進行判斷[
](https://testerhome.com/uploads/photo/2017/88ecd8db-f685-4e9a-a7af-3c4d7b6fb711.png!large)
腳本參數(shù)化的幾種方式
一耘戚、使用Jmeter自帶函數(shù)獲取參數(shù)值 Jmeter中可以產(chǎn)生值的函數(shù)有:Random( , , )嗡髓,threadNum,CSVRead( , )收津,StringFromFile( , , , ) 。函數(shù)調(diào)用方法就不細說了撞秋,因為Jmeter中有函數(shù)助手[
](https://testerhome.com/uploads/photo/2017/74059e48-7c1e-4bf0-8920-3246b46bb669.png!large) 然后將函數(shù)復(fù)制到需要用到隨機數(shù)的地方,當(dāng)我們設(shè)置的線程數(shù)超過隨機數(shù)范圍時串结,隨機數(shù)將會重復(fù)生成舅列。
不過需要重點介紹下正則表達式的使用,后續(xù)有需要用到關(guān)聯(lián)測試把敞,因為在測試過程過有些數(shù)據(jù)是經(jīng)常發(fā)生變化的榨惠,要獲取并使用這些數(shù)據(jù)奋早,就要使用關(guān)聯(lián)盛霎。[
](https://testerhome.com/uploads/photo/2017/92824be3-63ec-488c-859a-7be8aabb4c7e.png!large)
1、 第一個參數(shù):用于解析服務(wù)器響應(yīng)數(shù)據(jù)的正則表達式耽装。它會找到所有的匹配項摩渺。如果測試人員希望將表達式中的某部分應(yīng)用在模板字符串中,記得加上圓括號剂邮。2摇幻、 第二個參數(shù):這是一個模板字符串,函數(shù)會動態(tài)填寫字符串的部分內(nèi)容挥萌。要在字符串中引用正則表達式捕獲的匹配組合绰姻,請使用語法:$[group_number]$。例如$1$或者 $2$引瀑。測試人員的模板可以是任何字符串3狂芋、 第三個參數(shù):第3個參數(shù)告訴JMeter使用第幾次匹配。測試人員的正則表達式可能會找到多個匹配項憨栽。對此帜矾,測試人員有4種選擇:? 整數(shù)屑柔,直接告訴JMeter使用第幾個匹配項掸宛。 “1”對應(yīng)第一個匹配唧瘾,“2”對應(yīng)第二個匹配饰序,以此類推? RAND求豫,告訴JMeter隨機選擇一個匹配項? ALL,告訴JMeter使用所有匹配項猾蒂,為每一個匹配項創(chuàng)建一個模板字符串,并將它們連接在一起? 浮點值0到1之間罩缴,根據(jù)公式(找到的總匹配數(shù)目*指定浮點值)計算使用第幾個匹配項,計算值向最近的整數(shù)取整4烙荷、 第四個參數(shù):如果在上一個參數(shù)中選擇了“ALL”终抽,那么這第4個參數(shù)會被插入到重復(fù)的模板值之間5昼伴、 第五個參數(shù):如果沒有找到匹配項返回的默認(rèn)值6圃郊、 第六個參數(shù):重用函數(shù)解析值的引用名持舆,參見上面內(nèi)容7逸寓、 第七個參數(shù):輸入變量名稱覆山。如果指定了這一參數(shù)汹买,那么該變量的值就會作為函數(shù)的輸入晦毙,而不再使用前面的采樣結(jié)果作為搜索對象
二见妒、使用CSV Data Set Config獲取參數(shù)值[
](https://testerhome.com/uploads/photo/2017/07956f7f-1acf-4e80-a6d7-aa20b674f7ea.png!large)
三须揣、使用用戶定義的變量獲取參數(shù)值[
](https://testerhome.com/uploads/photo/2017/d3747148-55e5-4ac2-8928-98fab49cef51.png!large) 一般配合ForEach控制器一起使用
參數(shù)值的傳遞
一耻卡、利用Cookie進行值的傳遞 用JMeter進行接口調(diào)試時卵酪,有時候會遇到需要登錄的情況,如請求wetest的DataSearchAjax接口:[
](https://testerhome.com/uploads/photo/2017/040fc1fd-a17e-411f-b566-493ac6d14e19.png!large) 出現(xiàn)這種情況的原因很明顯是未登錄引起的蜒简。一個較好的解決方法就是將登錄后的cookies保存下來搓茬,在訪問DataSearchAjax接口的時候卷仑,帶上用戶登錄后的cookies信息進行查看漱挎】牧拢 在JMeter中膊夹,我們可以通過如下途徑進行cookies的傳遞放刨,如下圖添加HTPP Cookie管理器:[
](https://testerhome.com/uploads/photo/2017/9133cdb9-ea5b-4d9a-b6cf-d14f14060e84.png!large) 再給登錄的接口添加前置處理器Bean Shell PreProcessor进统,用來保存登錄的cookies:[
](https://testerhome.com/uploads/photo/2017/29b96836-e878-4d5f-aed1-0741b168fdc3.png!large) 我們要在Bean Shell PreProcessor里面添加我們的cookies值了螟碎。二掉分、利用正則匹配提取上一個接口的返回數(shù)據(jù)作為下個請求的輸入 用JMeter進行接口調(diào)試時酥郭,經(jīng)常會遇到上一接口的返回值中的某個字段不从,要作為下一接口的輸入,這種情況下载弄,我們需要利用正則匹配來提取我們需要的值撵颊〕拢 例如妻熊,若要提取相應(yīng)數(shù)據(jù)中的userid字段作為下個接口的輸入的話扔役,可以在該接口請求后面添加正則表達式提取器:[
](https://testerhome.com/uploads/photo/2017/8af43d26-d2bb-418d-977a-cc7b1a819b98.png!large) 我們給正則表達式提取器命名為get_userid亿胸,并填寫引用名稱侈玄、正則表達式序仙、模板、匹配數(shù)值律秃、缺省值棒动,填寫后的如如下:[
](https://testerhome.com/uploads/photo/2017/c2055827-ae22-4656-a658-dbc979696876.png!large)
填寫完成后迁客,在添加新的HTTP請求掷漱,來測試提取到的user_id字段:[
](https://testerhome.com/uploads/photo/2017/3be56d03-2e7e-4401-ba62-8bbf4339b314.png!large)
介紹幾個定時器的用法卜范,類于loadrunner中的thinktime海雪,集合點的設(shè)置
一、固定定時器(Constant Timer)[
](https://testerhome.com/uploads/photo/2017/2c8b307a-1aef-4566-8eec-a9cb009606c4.png!large) 這是一個很重要的定時器险掀,如果你需要讓每個線程在請求之前按相同的指定時間停頓樟氢,那么可以使用這個定時器埠啃;需要注意的是碴开,固定定時器的延時不會計入單個sampler的響應(yīng)時間潦牛,但會計入事務(wù)控制器的時間罢绽【仓眩 對于“java請求”這個sampler來說蒿叠,定時器相當(dāng)于loadrunner中的pacing(兩次迭代之間的間隔時間)市咽; 對于“事務(wù)控制器”來說,定時器相當(dāng)于loadrunner中的think time(思考時間:實際操作中溯革,模擬真實用戶在操作過程中的等待時間)致稀。二抖单、高斯隨機定時器(Gaussian Random Timer)[
](https://testerhome.com/uploads/photo/2017/0752d6c0-0ba5-4bed-a6c1-d98db575508e.png!large) 如果需要讓每個線程在請求之前按隨機的時間停頓耍休,那么可以使用這個定時器货矮,上圖表示暫停時間會分布在100到400之間三次屠、同步定時器(Synchronizing Timer)[
](https://testerhome.com/uploads/photo/2017/94dcf155-b39f-4ca8-8639-f5ab2673d5c3.png!large) 這個定時器和loadrunner當(dāng)中的集合點(rendezvous point)作用相似劫灶,其作用是:阻塞線程本昏,直到指定的線程數(shù)量到達后涌穆,再一起釋放雀久,可以瞬間產(chǎn)生很大的壓力(1)Number of Simulated Users to Group by:模擬用戶的數(shù)量赖捌,即指定同時釋放的線程數(shù)數(shù)量(2)Timeout in milliseconds:超時時間越庇,即超時多少毫秒后同時釋放指定的線程數(shù)
監(jiān)聽器配置
將下載的JMeterPlugins.jar包復(fù)制到Jmeter的lib目錄下面的ext目錄下面,重新啟動Jmeter卤唉,我們點擊添加就可以看到出現(xiàn)了很多的jp@gc-開頭的文件。這里監(jiān)控內(nèi)存我們使用的是:jp@gc - PerfMon Metrics Collectot 在使用之前竭恬,我們需要下載ServerAgent-2.2.1痊硕,然后運行/serverAgent/startAgent.bat這個文件寿桨,我們需要將serverAgent目錄及下面的文件復(fù)制到我們測試的服務(wù)器上亭螟,然后點擊打開,它的默認(rèn)端口為4444墨微∏滔兀 常用的監(jiān)聽器還有如下jp@gc - Active Threads Over Time锈麸,jp@gc - Transactions per Second忘伞,jp@gc - Response Times Over Time氓奈,jp@gc - Composite Graph鼎天,保存響應(yīng)到文件斋射,聚合報告绩鸣,察看結(jié)果樹[
](https://testerhome.com/uploads/photo/2017/fcb834f1-6257-4c54-9992-95ac55cfd73a.png!large)其中jp@gc - Composite Graph可以將多個監(jiān)聽視圖進行合并分析
最后測試報告的生成
使用jmeter進行性能測試呀闻,運行完畢后生成html格式的測試報告捡多,需要進行如下操作(3.0含及以上的版本):一、在jmeter.properties或者user.properties確認(rèn)如下配置項
? jmeter.save.saveservice.bytes = true? jmeter.save.saveservice.label = true? jmeter.save.saveservice.latency = true? jmeter.save.saveservice.response_code = true? jmeter.save.saveservice.response_message = true? jmeter.save.saveservice.successful = true? jmeter.save.saveservice.thread_counts = true? jmeter.save.saveservice.thread_name = true? jmeter.save.saveservice.time = true? jmeter.save.saveservice.timestamp_format = ms? jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HH:mm:ss
o 如果希望在Errors報告中展示更詳細數(shù)據(jù)蒜焊,需要確保如下配置: jmeter.save.saveservice.assertion_results_failure_message = trueo 如果使用了事務(wù)控制器(Transaction Controller)泳梆,確認(rèn)Generate parent sample為未勾選狀態(tài)
運行jmeter程序优妙,在命令行輸入如下信息1)Windows系統(tǒng)輸入格式如下:jmeter.bat -n -t -l -e -o 實際輸入:C:\apache-jmeter-3.0\bin\jmeter.bat -n -t Movie.jmx -l movie.jtl -e -o test
2)Linux系統(tǒng)輸入格式如下:jmeter -n -t -l -e -o 實際輸入:/opt/apache-jmeter-3.0/bin/jmeter -n -t final-result.jmx -l final-result.jtl -e -o /opt/apache-jmeter-3.0/test
[
安裝必要插件jmeter-plugins(windows下)
下載插件管理器
http://www.jmeter-plugins.org/get/ 將下載所得的jar包放在{jmeter}/bin/lib/ext目錄下
打開GUI模式下的jmeter下載所需插件
選擇菜單欄中的“選項”套硼,選擇“Plugings Manager”邪意,如圖
選擇所需插件安裝
打開插件管理器后選擇Available Plugings雾鬼,勾選3 Basic Graph 以及Custom Thread Groups,點擊Apply Changes and Restart JMeter嚷兔,等待下載完成重啟JMeter即可。
安裝必要插件jmeter-plugins(Linux下)
查找并復(fù)制jar包
在windows的界面下竟块,安裝好插件后浪秘,根據(jù)上圖的Review Changes中的信息埠况,在{jmeter}/bin/lib/ext中找到新增jar包辕翰,復(fù)制到linux上喜命。
使用JMeter測試
GUI模式下測試接口
添加線程組
在GUI模式,打開JMeter矛紫。右鍵點擊“測試計劃”颊咬,選擇“添加”→“Threads(Users)”→“線程組”喳篇,如圖所示:
添加HTTP請求
線程組屬性不做修改杭隙,右鍵點擊新添加的“線程組”痰憎,選擇“添加”→“Sampler”→“HTTP請求”,如圖所示:
完成HTTP請求
根據(jù)請求信息洽沟,完成“HTTP請求”:修改名稱裆操;注意IP和端口號踪区,在路徑欄補齊除ip端口號的剩余路徑缎岗;Implementation使用httpClient4传泊;使用https的協(xié)議需要在協(xié)議欄填寫https鸭巴;選擇請求的方法鹃祖,多數(shù)為POST或這GET惯豆;若請求體中含有中文,最好在content encoding中填寫utf-8地熄;請求參數(shù)可以選擇Parameters或者Body Data端考,Parameters的參數(shù)更加直觀,Body Data的更加方便參數(shù)修改且參數(shù)以parameter1=value1&mmeter2=value2形式扶供。
添加查看結(jié)果數(shù)
右鍵點擊“HTTP請求”椿浓,選擇“添加”→“監(jiān)聽器”→“查看結(jié)果樹”扳碍,如圖所示:
添加證書文件
協(xié)議為Https的請求還需要加載證書笋敞,如果為https協(xié)議君旦,在沒有加載證書的情況下哀墓,進行了測試麸祷,最好保存測試計劃阶牍,然后重啟JMeter走孽,重啟后先加載證書磕瓷,再進行測試困食,否則翎承,報錯叨咖。選擇“選項”→“SSL管理器”啊胶,如圖所示:
選擇pkcs12的證書文件
使用pkcs12的證書文件,jks直接用是不行的聘惦,需要java打包下
啟動測試
點擊“啟動”按鈕,啟動測試黔漂,如圖所示
輸入pcks12的密碼
啟動測試后瘟仿,彈出“KeyStore Password”劳较,輸入pcks12生成時用的密碼观蜗。
測試后查看結(jié)果樹
測試結(jié)束后墓捻,點擊“查看結(jié)果樹”砖第,可以看到當(dāng)前測試運行了一個實例环凿,選中該結(jié)果智听,點擊“響應(yīng)數(shù)據(jù)”查看響應(yīng)的文本,檢查文本是否為正確的響應(yīng)數(shù)據(jù)考赛,JMeter會把所有響應(yīng)碼200的回復(fù)都當(dāng)成成功颜骤,一些服務(wù)例如查詢等复哆,可能會設(shè)置查詢失敗下返回提示語句但響應(yīng)碼依舊是200。此時需要查看響應(yīng)文本中正確響應(yīng)的關(guān)鍵詞唆阿,方便壓測時設(shè)置響應(yīng)斷言驯鳖。
GUI模式下創(chuàng)建壓力測試計劃
添加Concurrency Thread Group
可以新建一個測試計劃久免,也可以在原先接口測試的測試計劃上修改阎姥。本例直接修改原先的接口測試,右鍵“測試計劃”泽腮,選擇擇“添加”→“Threads(Users)”→“Concurrency Thread Group”诊赊,如圖所示:
設(shè)置Concurrency Thread Group
根據(jù)需求完成線程組的設(shè)置碧磅,需要填寫“Target Concurrency”鲸郊,為壓力測試預(yù)期的并發(fā)壓力(注意Jmeter采用線程模擬并發(fā)的策略货邓,大并發(fā)意味著大量線程逻恐,測試機性能會大量消耗复隆,甚至影響測試結(jié)果挽拂,所以需要大并發(fā)的情況下亏栈,建議采用分布式部署Jmeter進行測試);“Ramp Up Time”黎侈,為測試并發(fā)數(shù)啟動所需時間(注意測試并不是所有并發(fā)啟動后才運行闷游,在啟動過程中脐往,先啟動的線程會先運行請求);“Ramp Up Steps Counts”瘤礁,為是否將啟動線程分階段的啟動柜思,例如10即為分10次階段性的啟動一部分線程酝蜒,可以為空矾湃;“Hold Target Rate Time”邀跃,為并發(fā)達到要求后再運行多久時間拍屑;“Time Unit”,時間單位喷斋,非常重要星爪,有分和秒顽腾,不要選擇錯誤诺核。
添加Http請求
直接復(fù)制之前接口測試時的http請求,刪去查看結(jié)果樹即可裙士。
添加聚合報告
右鍵http請求幌甘,選擇“添加”→“監(jiān)聽器”→“聚合報告”锅风。如圖所示
聚合報告中保存測試數(shù)據(jù)
在聚合報告的“文件名”欄皱埠,填入./*****-${__time(yyyyMMdd-HHmmss,)}.jtl,表示在當(dāng)前目錄生成jtl(jmeter的數(shù)據(jù)文件格式)训枢,${__time(yyyyMMdd-HHmmss,)}為jmeter的時間函數(shù)恒界,生成測試的年月日分鐘秒十酣,方便后期管理測試數(shù)據(jù)际长。
添加響應(yīng)斷言
右鍵http請求工育,選擇“添加”→“斷言”→“響應(yīng)斷言”如绸,如圖所示:
配置響應(yīng)斷言
不同請求配置不同的斷言怔接。根據(jù)之前的接口測試,點擊添加,輸入判斷文本谎势,不同模式匹配規(guī)則,自行百度
保存測試計劃
刪除接口測試的線程組猖毫,點擊“文件”吁断,選擇“保存測試計劃為”仔役,保存測試計劃是己。壓測計劃創(chuàng)建完成卒废。注意3.1版本“保存測試計劃為”下面是“選中部分保存為”,舊版就是“保存為”逆皮,會保存選中的部分电谣,然后實際測試的時候因為測試計劃不完整是沒法跑測試的辰企,會報Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!况鸣,這雷舊版很容易踩上镐捧。
NO-GUI模式下啟動壓力測試
Windows下
打開cmd,目錄切換到測試計劃(jmx)所在的目錄懂酱,證書放在同一目錄下,輸入{jmeter}/bin/jmeter -Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** -n -t *.jmx {jmeter}為jmeter的安裝目錄 -Djavax.net.ssl.keyStore=****.pkcs12 是證書文件 -Djavax.net.ssl.keyStorePassword=**** 是證書文件生成時的密碼 -n 為nogui模式 -t 后面為測試計劃文件(jmx)
linux下(推薦)
目錄切換到測試計劃(jmx)所在的目錄整陌,證書放在同一目錄下泌辫,輸入{jmeter}/bin/jmeter -Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** -n -t *.jmx |tee -a *.out {jmeter}為jmeter的安裝目錄 -Djavax.net.ssl.keyStore=****.pkcs12 是證書文件 -Djavax.net.ssl.keyStorePassword=**** 是證書文件生成時的密碼 -n 為nogui模式 -t 后面為測試計劃文件(jmx) tee -a 參數(shù)后為文本文件震放,用于保存測試時輸出summarize數(shù)據(jù) 若是為http的殿遂,Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** 直接省去
使用JMeter查看數(shù)據(jù)
在GUI模式下
選擇報表
打開Jmeter,右擊測試計劃幢竹,選擇“添加”→“監(jiān)聽器”→“聚合報告”妨退;“添加”→“監(jiān)聽器”→“Response Times Over Time”咬荷;“添加”→“監(jiān)聽器”→“Transactions per Second”(有其他圖表需要可以自行下載插件安裝)轻掩,如圖所示:
加載數(shù)據(jù)
選擇聚合報告唇牧,點擊文件名欄后的瀏覽丐重,選擇jtl文件,加載數(shù)據(jù)(其余監(jiān)聽器類似)臀蛛,如圖所示:
其他:
http會產(chǎn)生cookie的浊仆,需要刪除或者其他操作的抡柿,需要添加cookie管理器等恐。 默認(rèn)jtl數(shù)據(jù)不保存響應(yīng)文本,需要保存錯誤文件的信息闪檬,可以添加監(jiān)聽器中的保存響應(yīng)到文件粗悯,勾選Save Failed Responses only(不推薦有較多錯誤的情況去保存文本样傍,容易卡咨栏纭)襟锐。 Bin目錄下有個templates文件夾粮坞,里面有些JMeter用法的例子,可以看看互例。 NOGUI模式下可以使用jmeter -g result.jtl -o ./ResultReport生成一個html的報表(3.0版本以上)
[jmeter進行分布式測試]
一媳叨、背景:
之前在Jmeter插件監(jiān)控服務(wù)器性能一篇中說到糊秆,在非GUI環(huán)境中監(jiān)控時為了保存監(jiān)控數(shù)據(jù)需要修改jmeter腳本,并且每次通過施壓機(遠程服務(wù)器痘番,非GUI環(huán)境)來壓測時都要將jmeter腳本上傳然后在服務(wù)器上通過命令行啟動夫偶,測試完成后再把結(jié)果數(shù)據(jù)下載到本地GUI環(huán)境中查看觉增,總是有很多不方便。
本次壓測需求需要很大的并發(fā)量说铃,例如3000,但是單臺施壓機難以實現(xiàn)腻扇,因此希望多臺施壓機并行幼苛,并且我能同步控制它們。
在這樣的需求下經(jīng)過了解墙杯,jmeter工具本身有一個很強大的遠程啟動功能高镐,于是嘗試了一下嫉髓。
二邑闲、jmeter分布式原理
客戶端機器作為一個控制器controller偷霉,控制多臺slave機器的操作类少。
controller通過GUI界面啟動slave機器硫狞,將jmeter壓測發(fā)送給每臺啟動的slave残吩,slave獲得腳本后開始執(zhí)行倘核。slave本地不需預(yù)先存儲腳本紧唱;
各臺slave執(zhí)行完成后隶校,將結(jié)果傳回給controller深胳,controller收集整合顯示舞终。
三权埠、jmeter遠程啟動配置
服務(wù)器(slave)配置
服務(wù)器(slave)需安裝jmeter煎谍,最好與客戶端(controller)保持同版本呐粘,jdk最好也保持同版本作岖,無法滿足時至少保證服務(wù)器上的jmeter能正常運行(如jmeter3.0以后需要jdk1.7及以上版本)痘儡。
注意:上圖紅框中的ip為服務(wù)器的ip地址醉途,當(dāng)服務(wù)器有多網(wǎng)卡時它會隨機挑選一個網(wǎng)卡使用殴穴,紅框中的端口號port為啟動jmeter服務(wù)監(jiān)聽的port货葬,一般會有個默認(rèn)端口號1099震桶,但最好自定義,確保端口號不沖突尊残。修改方法在下文介紹。
客戶端(controller)配置
在客戶端上要保證執(zhí)行命令能發(fā)送到服務(wù)器顷扩,因此需配置客戶端遠程的ip地址和port隘截。在客戶端安裝目錄的bin文件夾下汹胃,找到j(luò)meter.properties着饥,修改配置如下圖,其中ip和port即為上一步slave的ip和port,如上圖中jmeter-server啟動時紅框中顯示的內(nèi)容呵哨。多個slave機器的配置可通過逗號分隔孟害。
remote_hosts=10.165.124.6:1029
四名眉、問題
slave機器的自定義端口號配置
在slave機器的%JMETER_HOME%bin目錄下找到j(luò)meter.properties,修改如下兩項配置福压,即可自定義端口號:
server_port=1029server.rmi.localport=1029
修改后執(zhí)行服務(wù)端的jmeter-server即可看到控制臺消息中修改是否生效荆姆;修改生效后需在客戶端修改相應(yīng)的jmeter.properties下的remote_hosts胆筒。
slave機器和客服端多網(wǎng)卡的問題
我在執(zhí)行過程中slave機器的jmeter-server.log和客戶端的jmeter.log中均報錯提示connect refused诈豌。經(jīng)過檢查后發(fā)現(xiàn)服務(wù)器上有2個網(wǎng)卡队询,客戶端有兩個網(wǎng)卡蚌斩,兩臺機器通過vpn在內(nèi)網(wǎng)環(huán)境通信送膳。而jmeter在遠程通信的時候是隨機選擇一個網(wǎng)卡的ip丑蛤,這樣很容易導(dǎo)致連接不成功受裹。
可通過如下配置指定服務(wù)器和客戶端的網(wǎng)卡,在服務(wù)器端的jmeter-server文件中厦章,修改配置指定服務(wù)器端的網(wǎng)卡ip
RMI_HOST_DEF=-Djava.rmi.server.hostname=10.165.124.6
在客戶端的jmeter.bat中修改配置指定客戶端的網(wǎng)卡ip
增加配置項:set rmi_host=-Djava.rmi.server.hostname=10.165.120.4修改配置項:set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %CLASS_UNLOAD% %DDRAW% %rmi_host%
在修改配置后嘗試遠程啟動袜啃,發(fā)現(xiàn)還是不成功群发,打開客戶端jmeter.log,發(fā)現(xiàn)客戶端發(fā)送成功熟妓;打開服務(wù)器端的jmeter-server.log顯示服務(wù)器連接客戶端不成功滑蚯,嘗試ping了一下也確實ping不通,然后網(wǎng)上搜了一下說是因為客戶端的防火墻阻止了坤次,關(guān)閉客戶端所有防火墻缰猴,再次執(zhí)行疤剑,測試成功隘膘。
依賴文件報錯的問題
當(dāng)jmeter腳本中需要依賴csv等數(shù)據(jù)文件時纵势,該文件需上傳至服務(wù)器牛曹,并需要設(shè)置正確的路徑鸳玩。
處理利用jmeter實施監(jiān)控壓測時受壓機的各項性能
操作步驟:
施壓機上的jmeter/lib/ext中放入下載的插件包 jmeter-plugins-perfmon-2.1.jar
受壓機上放入ServerAgent-2.2.1
運行受壓機上的ServerAgent
施壓機上:添加監(jiān)控:運行case,可查看曲線結(jié)果
非GUI圖像操作:
由于非GUI圖像需要先存儲數(shù)據(jù)米诉,然后放到GUI圖形界面中查看或處理魏身,而在非GUI中運行jmeter的命令時未提供如何保存性能數(shù)據(jù)的方法家制,在此可通過shell腳本修改保存性能數(shù)據(jù)的路徑。腳本如下:其中filename為保存jemter壓測結(jié)果數(shù)據(jù)的文件名哪亿,serverFilename為保存jmeter壓測時相應(yīng)服務(wù)器性能數(shù)據(jù)的文件名。
!/bin/basharg1=$1arg2=$2arg3="Click"filename="result_"$arg3"$1$2.jtl"serverFilename="serverInfo_"$arg3"$1$2.jtl"echo $arg1 echo $arg2echo $serverFilenamesed -i -e 's|<stringProp name="ThreadGroup.num_threads">.|<stringProp name="ThreadGroup.num_threads">'"$arg1"'</stringProp>|' captchaClick.jmxsed -i -e 's|<stringProp name="filename">.|<stringProp name="filename">'"$serverFilename"'</stringProp>|' captchaClick.jmx../../bin/jmeter -n -t ./captchaClick.jmx -l ./$filename
問題:
受壓機上的ServerAgent的執(zhí)行腳本直接關(guān)閉時無法正常關(guān)閉埋涧,需通過kill -9命令殺掉進程醇坝。
##################################################################
http://www.s-uu.com/index.php/2017/05/23/230/
https://www.iyunv.com/thread-385799-1-1.html
##########################################################
1、求和
cat data|awk '{sum+=$1} END {print "Sum = ", sum}'
2、求平均
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'
3淫僻、求最大值
cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
4细办、求最小值(min的初始值設(shè)置一個超大數(shù)即可)
awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'
5钓觉、求訪問次數(shù)的Top 10 Resource,可以根據(jù)此進行優(yōu)化
cat output/logs/cookie_logs/date +%u
/cookie_log|grep -v '172.16'|grep -v '127.0.0.1' |awk -F' ' '{ if(index($1,"219.141.246")!=0) print $2; else print $1 } '|sort|uniq -c|sort -n |tail -n 10
QPS:每秒查詢率(Query Per Second) ,每秒的響應(yīng)請求數(shù)荧缘,也即是最大吞吐能力。QPS = req/sec = 請求數(shù)/秒QPS統(tǒng)計方式 [一般使用 http_load 進行統(tǒng)計]QPS = 總請求數(shù) / ( 進程總數(shù) * 請求時間 )QPS: 單個進程每秒請求服務(wù)器的成功次數(shù)
峰值QPS:原理:每天80%的訪問集中在20%的時間里意推,這20%時間叫做峰值時間公式:( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時間每秒請求數(shù)(QPS)
PV:訪問量即Page View, 即頁面瀏覽量或點擊量俊性,用戶每次刷新即被計算一次單臺服務(wù)器每天PV計算公式1:每天總PV = QPS * 3600 * 6公式2:每天總PV = QPS * 3600 * 8
UV:獨立訪客即Unique Visitor,訪問您網(wǎng)站的一臺電腦客戶端為一個訪客。00:00-24:00內(nèi)相同的客戶端只被計算一次服務(wù)器數(shù)量:機器:峰值時間每秒QPS / 單臺機器的QPS = 需要的機器機器:ceil( 每天總PV / 單臺服務(wù)器每天總PV )
并發(fā)數(shù):并發(fā)用戶數(shù)是指系統(tǒng)可以同時承載的正常使用系統(tǒng)功能的用戶的數(shù)量
吐吞量:吞吐量是指系統(tǒng)在單位時間內(nèi)處理請求的數(shù)量
響應(yīng)時間(RT):響應(yīng)時間是指系統(tǒng)對請求作出響應(yīng)的時間
例子:每天300w PV 的在單臺機器上,這臺機器需要多少Q(mào)PS?答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)如果一臺機器的QPS是58,需要幾臺機器來支持?答:139 / 58 = 3
這篇文章將關(guān)注測試金字塔里的單元測試層附井,并探討如何高效地為分布式系統(tǒng)(如微服務(wù))構(gòu)建單元測試。
定義測試邊界
定義測試邊界是實現(xiàn)高效測試的第一步着逐。測試的目的是為了驗證邊界里“黑盒”的行為是否符合預(yù)期,我們向黑盒輸入數(shù)據(jù)魁蒜,然后驗證輸出的正確性细移。
在單元測試?yán)铮诤兄傅氖呛瘮?shù)或者類的方法速缨,目的是單獨測試特定代碼塊的行為搁吓。為了更好地理解這個概念,我們以簡單的注冊功能為例:
我們可以看到這個函數(shù)包含了一些輸入和輸出。這個函數(shù)接受基本的用戶注冊信息作為輸入?yún)?shù),并返回新創(chuàng)建的用戶ID。
不過這里也有一些不是很明顯的輸入數(shù)據(jù)绘搞。這個函數(shù)調(diào)用了另個外部函數(shù):一個向數(shù)據(jù)庫插入數(shù)據(jù)董饰,一個對密碼進行散列和持久化娄帖。在某些情況下桂肌,數(shù)據(jù)庫可能會返回錯誤。比如干厚,因為用戶名唯一性問題導(dǎo)致數(shù)據(jù)庫插入失敗谆扎,又或者需要通過調(diào)用外部的微服務(wù)進行密碼散列,如果網(wǎng)絡(luò)連接出現(xiàn)問題或密碼散列服務(wù)因發(fā)生過載導(dǎo)致服務(wù)超時伺糠,那么密碼散列函數(shù)就會返回錯誤舵揭。
為了全面測試用戶注冊功能,單元測試所要做的不僅僅是簡單地傳進去不同的輸入?yún)?shù),它還要能夠讓外部依賴項能夠使用這些輸入來驗證函數(shù)的行為是否符合預(yù)期耕漱。在測試函數(shù)的錯誤處理邏輯時妓笙,這點很重要的拉鹃。
Stub和Mock
為了制造各種輸入數(shù)據(jù),需要使用stub,也叫作mock竭业。這個可以使用依賴注入或方法攪拌(swizzle)來實現(xiàn)击纬。測試框架在運行被測試的函數(shù)時可以確保對底層依賴項的調(diào)用會被重定向到stub上:
我們可以使用stub來達到各種目的:
stub可以什么事也不做肯腕。這樣可以加快個別單元測試的速度涉瘾,如果后續(xù)有其他單元測試可用于測試邊界情況的話就可以這樣做。
stub可返回任意的值,用于模擬外部函數(shù)的輸出赁还。這在測試罕見的邊界情況時會非常有用柬焕,比如有些錯誤場景很少會發(fā)生或者難以重現(xiàn)病涨。
stub也可以用于捕捉被測試函數(shù)欲傳給外部函數(shù)的參數(shù)幻工,或者把這些參數(shù)記錄下來当悔。這樣就可以驗證被測試函數(shù)需要調(diào)用哪些外部函數(shù)以及需要傳給外部函數(shù)哪些參數(shù)饼疙。
測試分布式系統(tǒng)需要有一套很好的stub,有了這些stub,單元測試才能夠在沒有外部服務(wù)的情況下運行。下面列出了一些工具括眠,用于創(chuàng)建各種stub。
Node.js/JavaScript
sinon.js (提供了stub和間諜功能)
testdouble.js (主要用于面向?qū)ο驛PI的stub生成器)
nock (主要用于模擬HTTP請求行為)
Python****
mock
Go
gomock
Java
mockito
easymock
單元測試流程
單元測試的目的是為了給開發(fā)人員提供快速驗證他們所寫代碼的行為。因為對外部依賴的調(diào)用使用了stub,所以通常可以在幾秒鐘內(nèi)就可以執(zhí)行數(shù)千個單元測試盖喷。所以,開發(fā)人員可以把單元測試加入到他們的開發(fā)工作流當(dāng)中咙冗,要么直接集成到他們的IDE里挫望,要么通過終端命令行來運行蛉幸。開發(fā)人員在編寫代碼的同時頻繁地運行單元測試可以幫助他們及早地發(fā)現(xiàn)代碼中的問題烫沙。
一旦開發(fā)人員養(yǎng)成了這樣的習(xí)慣,那么就可以進行測試驅(qū)動開發(fā)了。開發(fā)人員在開發(fā)新特性之前會先準(zhǔn)備好單元測試,在新特性被加進來之前,測試總是失敗。在經(jīng)過不斷的測試和代碼修改之后,一個完整的功能被開發(fā)出來了,最后再運行測試就能通過。
單元測試的作用不應(yīng)局限于代碼開發(fā)只怎,它們也應(yīng)該被集成到代碼合并流程里。GitHub支持一些主流持續(xù)集成服務(wù)器的狀態(tài)檢查季稳。一般的流程是這樣的:保護好“master”分支,不允許開發(fā)人員向該分支提交代碼,而是讓他們把代碼提交到其他分支上一忱。在將代碼合并到master分支的時候帘营,GitHub要求先通過狀態(tài)檢查。
Jenkins问顷、CircleCI和TravisCI都提供了狀態(tài)檢查鉤子(hook)杜窄,它們會從分支上獲取代碼并運行單元測試塞耕。如果通過了驾讲,就允許合并代碼,否則就不允許胧奔。
總結(jié)
單元測試是測試工具箱里的一個非常重要的工具。為了對分布式系統(tǒng)代碼進行全面的單元測試笔诵,有必要利用一些支持stub的測試框架岳服,用于模擬各種錯誤場景或外部依賴的各種響應(yīng)。