一邪锌、Fiddler抓包工具的配置和使用
在編寫網(wǎng)關(guān)自動(dòng)化腳本之前觅丰,得先學(xué)會(huì)如何抓包蜕企,這里以Fiddler為例糖赔。會(huì)抓包的同學(xué)可以跳過(guò)這一步,當(dāng)然看看也是沒壞處的……
局域網(wǎng)絡(luò)配置
將要進(jìn)行抓包的手機(jī)與電腦連入同一局域網(wǎng)奋构,電腦才能夠抓到手機(jī)APP的請(qǐng)求弥臼,這里介紹一種我們?cè)谑褂玫木W(wǎng)絡(luò)配置方法。
首先使用電腦A布置一個(gè)我們抓包需要的局域網(wǎng)纳猪。下載獵豹WiFi(網(wǎng)上有很多這種工具360免費(fèi)WiFi、百度WiFi等鼠锈,隨意下載一個(gè)就好购笆,這里我們以獵豹WiFi為例),安裝完后創(chuàng)建一個(gè)WiFi即可行您。
然后使用抓包的電腦B連接剛剛建立的WiFi娃循,連接好后查看電腦B的IP地址笛质。
用測(cè)試手機(jī)連接剛剛建立的WiFi,在局域網(wǎng)設(shè)置中將其代理改為電腦B的IP地址敲霍,端口號(hào):8888肩杈,保存即可。
Fiddler配置
Fiddler的安裝夫偶,在網(wǎng)上下載最新的版本就可以,這里給出一個(gè)我安裝的4.5版本的鏈接http://sq.jd.com/bFPg1z卵佛,下載安裝,步驟就省略了植捎,下一步..下一步即可焰枢。
安裝完成后打開Fiddler济锄,在菜單欄Tools->Fiddler Options->Connections,勾選Allow remote computers to connect避消,默認(rèn)的端口號(hào)為8888恕沫,這里不需要修改鲸阔,在修改手機(jī)代理設(shè)置時(shí)注意與這里一致隶债。
因?yàn)槲覀兯枰ト〉幕旧隙际蔷〇|到家有關(guān)的請(qǐng)求,所以我們可以設(shè)置只抓取我們所需要的請(qǐng)求曲梗,如圖愧旦,選中右方Filters,在下方Hosts設(shè)置中選擇Show only the follow Hosts祖凫,然后填入我們所需要抓取請(qǐng)求的Host遭庶,比如這里填入的是京東到家Android線上和預(yù)發(fā)布的Host峦睡。
到這里Fiddler的基本配置就完成了,接下來(lái)就可以開始抓包啦龙屉。
Fiddler抓包實(shí)例
開啟Fiddler事哭,確定本機(jī)網(wǎng)絡(luò)連接鳍咱,查看本機(jī)IP谤辜、Fiddler端口號(hào)。
本機(jī)IP:192.168.191.2
Fiddler端口號(hào):8888
手機(jī)連接同一局域網(wǎng)脯倚,設(shè)置代理推正。
打開手機(jī)京東到家應(yīng)用,清空電腦Fiddler遺留抓取結(jié)果尊残,點(diǎn)擊如圖所示按鈕,點(diǎn)擊第一個(gè)Remove all即可竞端。
下拉刷新京東到家首頁(yè),抓取其HTTP請(qǐng)求。
分析Fiddler抓包數(shù)據(jù)啡邑。在右上方結(jié)果框中選擇Inspectors->Raw即可看到請(qǐng)求的URL贵扰、Cookie和Host等有關(guān)信息。在右下方結(jié)果框中選擇JSON就能看到請(qǐng)求返回的JSON字符串舞丛。這里的JSON字符串是我們判斷請(qǐng)求是否成功的重要依據(jù)。
提示:在每次抓取時(shí)重復(fù)下步驟3中清空結(jié)果列表的操作吨凑,可以更容易地找到需要抓取的請(qǐng)求。
二焕妙、Jmeter的基本使用
Jmeter的安裝配置
下載Jmeter痕届。我們使用的Jmeter版本是2.1.3研叫,大家可以在\\192.168.202.207\share\pengyun中直接下載apache-jmeter-2.13.zip即可,里面已經(jīng)安裝了需要的jar包和插件。
安裝JDK哗讥。Jmeter2.1.3需要安裝JDK 6或以上版本,沒有安裝的同學(xué)記得安裝决乎,還是給大家一個(gè)鏈接吧娘摔,http://sq.jd.com/VaGwoP,需要的同學(xué)可以下載肠缨,安裝完成后配置環(huán)境變量即可,參考鏈接http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html脑慧。
安裝Jmeter。解壓即可,無(wú)需多言也物。
第一個(gè)Jmeter腳本
這里很難對(duì)Jmeter做一個(gè)全面的介紹,而且我也只是了解了一些皮毛告材,所以就在實(shí)例中一一介紹吧浙踢,所有配置齊全之后胰舆,就開始我們的第一條腳本吧骚露。下面的步驟說(shuō)得比較詳細(xì),比較啰嗦缚窿,請(qǐng)勿急躁棘幸。
抓取需要的請(qǐng)求。這一步是在Fiddler中完成的倦零,如果你是從頭看到這的误续,那么這一步的內(nèi)容就可以省略了。這里我們就以前面抓到的京東到家首頁(yè)的請(qǐng)求為例。下圖那個(gè)很重要的結(jié)果等會(huì)要用到糟描。
運(yùn)行Jmeter估灿。在安裝目錄下的bin文件夾里打開jmeter.bat汗销,后面的黑框能夠輸出一些斷言結(jié)果。在右面的名稱那里可以修改你要?jiǎng)?chuàng)建的測(cè)試腳本的名稱慰丛,默認(rèn)是測(cè)試計(jì)劃。
創(chuàng)建線程組恤左。測(cè)試計(jì)劃右鍵選添加->Threads->線程組巧鸭。
修改名稱。修改線程組名稱并不重要,根據(jù)自己的需要修改就行兴蒸。由于我們執(zhí)行腳本一般在需要的時(shí)候執(zhí)行一次就可以区宇,并不需要其他的配置,所以下方的線程屬性就保持默認(rèn)值即可(在進(jìn)行壓力測(cè)試的時(shí)候就需要進(jìn)行配置了)。
添加HTTP請(qǐng)求桐愉。右鍵線程組選擇HTTP請(qǐng)求。
填寫HTTP請(qǐng)求相關(guān)信息荆烈。這一步是關(guān)鍵屎飘,需要根據(jù)步驟1中Fiddler里那段很重要的信息去填寫押桃。名稱自行修改,Host峰鄙、協(xié)議、請(qǐng)求方法铣减、請(qǐng)求路徑都能夠在抓取到的信息中獲取,拷貝過(guò)來(lái)就行。
注意:HTTP請(qǐng)求有GET和POST兩種贝室,不同的請(qǐng)求記得選擇不同的請(qǐng)求方法!P铩齿坷!
添加Cookie管理器污呼。右鍵線程組選擇Cookie管理器酱讶。將抓取到的信息添加至Cookie管理器中。
添加結(jié)果樹沛简。到這里這條Case就算是編寫完成了,在運(yùn)行之前我們還需要添加一個(gè)結(jié)果樹腻脏,來(lái)查看Case運(yùn)行的結(jié)果殃饿。右鍵線程組選擇查看結(jié)果樹添加。
運(yùn)行。在上方找到運(yùn)行按鈕運(yùn)行即可梭域。注意循衰,如果有多個(gè)線程組或者多個(gè)HTTP請(qǐng)求,點(diǎn)擊運(yùn)行后都會(huì)全部一起運(yùn)行。
結(jié)果分析避归。點(diǎn)擊結(jié)果樹即可查看運(yùn)行結(jié)果,綠色為成功,紅色為失敗。在右邊點(diǎn)擊相應(yīng)數(shù)據(jù)就能夠看到返回的JSON字符串了仪或。
這樣我們的第一條Jmeter腳本就基本完成了仲器,基本所有的HTTP請(qǐng)求都是大同小異鹃彻,多練習(xí)寫幾條基本就能手到擒來(lái)了绿淋。結(jié)果樹和Cookie管理器每個(gè)線程組添加一個(gè)就夠用了莲蜘。
三、Jmeter使用標(biāo)準(zhǔn)化
實(shí)際上,完成上面兩個(gè)步驟并不算是真正學(xué)會(huì)了腳本的編寫刻获,因?yàn)槟_本中最重要的一部分是它的斷言沐兵,斷言是來(lái)判斷網(wǎng)關(guān)返回JSON結(jié)果是否正確和完整的重要手段螟左。下面的內(nèi)容寫得比較啰嗦次酌,麻煩大家一定要耐心點(diǎn),別睡著蜕煌!
參數(shù)化
1派阱、簡(jiǎn)介
在寫過(guò)一些腳本之后大家可能就會(huì)發(fā)現(xiàn),所謂的寫腳本無(wú)非就是不停地復(fù)制斜纪,粘貼贫母,復(fù)制,粘貼……于是大家肯定會(huì)想一些讓自己能更快復(fù)制粘貼的方法盒刚。參數(shù)化的方法就能在簡(jiǎn)化這個(gè)過(guò)程的同時(shí)讓大家更清晰地認(rèn)識(shí)到URL的結(jié)構(gòu)腺劣。
URL其實(shí)就是很多個(gè)參數(shù)組成的,而里面的參數(shù)一般是會(huì)加密的因块,為了更好地了解URL的結(jié)構(gòu)橘原,可以對(duì)URL進(jìn)行解碼,這個(gè)百度一下大把解碼工具可以用涡上,都是在線的趾断,很是方便。這里給個(gè)參考的鏈接http://meyerweb.com/eric/tools/dencoder/吩愧,URL粘進(jìn)去點(diǎn)Decode即可芋酌。
解碼結(jié)果如下:
從解碼后的URL里可以看出其中很多參數(shù)的值,appName雁佳、signKey脐帝、screen同云、body等都是。經(jīng)過(guò)對(duì)大量URL的分析堵腹,發(fā)現(xiàn)所有京東到家請(qǐng)求URL中有很多參數(shù)是不變的炸站。更具體來(lái)說(shuō),根據(jù)請(qǐng)求的不同疚顷,只有signKey旱易、body和functionId這三個(gè)參數(shù)是發(fā)生改變的,其余的參數(shù)荡含,在賬號(hào)和手機(jī)設(shè)備不變的情況下是不會(huì)發(fā)生變化的咒唆。這樣的話,我們把那些不變的參數(shù)放在一起統(tǒng)一管理释液,每次在寫新的腳本的時(shí)候全释,只需要改變那三個(gè)不同的參數(shù)就可以了。
2误债、實(shí)現(xiàn)方法
1)設(shè)置參數(shù)浸船。在線程組右鍵選擇添加->配置原件->用戶定義的變量。
然后在定義變量的頁(yè)面點(diǎn)擊下方添加按鈕進(jìn)行URL參數(shù)的添加寝蹈,這里參考解碼后的URL李命,將其中的參數(shù)逐一進(jìn)行添加。從下圖中可以看到箫老,除了signKey封字、body和funtionId這三個(gè)參數(shù)外,其與參數(shù)都被添加耍鬓。我們也能夠發(fā)現(xiàn)這些參數(shù)大都是和手機(jī)型號(hào)阔籽、系統(tǒng)、app名稱版本等信息有關(guān)的牲蜀,只要手機(jī)設(shè)備不更換笆制、到家版本不更新,這套參數(shù)是可以一直用下去的涣达。當(dāng)然大家在使用自己設(shè)備和賬號(hào)的時(shí)候記得更新下這些參數(shù)在辆。
2)給請(qǐng)求添加參數(shù)《忍Γ回到到家首頁(yè)的HTTP請(qǐng)求匆篓,這時(shí)候我們已經(jīng)不需要在路徑的框里粘貼上那條很長(zhǎng)很長(zhǎng)的URL了。那么怎么使用上一步中的參數(shù)呢寇窑?看了下面這張圖就明白了奕删。這里引用參數(shù)的方法是${參數(shù)名}×迫希可以看到下面的表中的參數(shù)是通請(qǐng)求一起發(fā)送的參數(shù)完残,也就是說(shuō)是這些參數(shù)組成了原來(lái)的那條很長(zhǎng)很長(zhǎng)的URL。
注意下圖表中框出的三個(gè)參數(shù)横漏,就是前面一直在提到的每個(gè)請(qǐng)求都不同的那三個(gè)參數(shù)谨设,signKey、body缎浇、functionId扎拣。那么以后再寫新的腳本的時(shí)候,只需要改這三個(gè)參數(shù)素跺,其他的地方都不需要改動(dòng)二蓝。注意:下面的body參數(shù)是經(jīng)過(guò)解碼的,所以應(yīng)當(dāng)勾選后面的編碼框指厌。
3刊愚、實(shí)例
說(shuō)了這么多,大家肯定會(huì)覺得沒有必要這么麻煩踩验,直接復(fù)制粘貼不就好了么鸥诽,那么下面就舉一個(gè)例子來(lái)體現(xiàn)下參數(shù)化的好處。按照上面的步驟設(shè)置添加好參數(shù)后箕憾,首頁(yè)的腳本應(yīng)當(dāng)是可以運(yùn)行了牡借,下面我們以首頁(yè)為基準(zhǔn),來(lái)寫一條新的腳本袭异,以秒殺頁(yè)面為例钠龙。
第一步:使用Fiddler抓取秒殺頁(yè)面的請(qǐng)求,對(duì)URL進(jìn)行解碼御铃。注意標(biāo)記的三個(gè)參數(shù)一會(huì)要用碴里。
第二步:選擇"首頁(yè)"腳本,右鍵點(diǎn)擊選擇復(fù)制畅买,選擇"京東到家"線程組并闲,右鍵點(diǎn)擊粘貼,其實(shí)就是把首頁(yè)的腳本復(fù)制一份谷羞。于是線程組里又出現(xiàn)了一個(gè)新的首頁(yè)帝火。
第三步:選擇新復(fù)制的首頁(yè)腳本,將其名稱改為"秒殺頁(yè)面"湃缎,然后把參數(shù)列表中的那三個(gè)參數(shù)改為第一步中對(duì)應(yīng)的值犀填,然后Ctrl+S保存就可以啦。
是的嗓违,只需要這三步九巡,就可以完成一個(gè)腳本,整個(gè)過(guò)程不超過(guò)一分鐘蹂季。以后寫每個(gè)腳本都可以用這三步實(shí)現(xiàn)冕广。當(dāng)然疏日,后續(xù)給腳本加上斷言之后還需要改動(dòng)斷言。
響應(yīng)斷言
如果你是從開頭一步一步讀過(guò)來(lái)的撒汉,那么你現(xiàn)在一定能夠很快地寫出一條腳本沟优,這時(shí)候就有一個(gè)問(wèn)題出現(xiàn)了,腳本寫完了睬辐,可以運(yùn)行了挠阁,也可以看到運(yùn)行返回的結(jié)果了,那怎么能知道返回的結(jié)果是不是正確呢溯饵?是不是完整呢侵俗?這里先介紹一種簡(jiǎn)單的判斷方式:響應(yīng)斷言。
右鍵點(diǎn)擊HTTP請(qǐng)求添加->斷言->響應(yīng)斷言丰刊。
這里的響應(yīng)斷言主要是針對(duì)HTTP請(qǐng)求返回的JSON字符串的隘谣,我們一般使用的是包括斷言,就是返回的結(jié)果是否包含我們需要的信息藻三。斷言文本的截取可以在運(yùn)行結(jié)果樹里進(jìn)行洪橘,將結(jié)果顯示類型改為Text(當(dāng)然也可以JSON格式和Text格式對(duì)比著找),找出需要斷言的信息棵帽。
需要注意的是響應(yīng)斷言支持正則表達(dá)式熄求,這可以對(duì)一些經(jīng)常變化但格式固定的內(nèi)容做一些斷言。下圖中最后一條斷言就是正則表達(dá)式逗概,其內(nèi)容表達(dá)的是秒殺剩余時(shí)間是否大于0小于3600秒弟晚。這個(gè)可以根據(jù)檢測(cè)點(diǎn)的需要去添加。想學(xué)習(xí)正則表達(dá)式的同學(xué)可以戳鏈接:http://deerchao.net/tutorials/regex/regex.htm逾苫。
當(dāng)然卿城,響應(yīng)斷言的缺點(diǎn)很明顯,它的格式過(guò)于固定铅搓,不能滿足一些檢查點(diǎn)的需求操作瑟押,比如比較大小,檢查字段值是否為空星掰。還有就是正則表達(dá)式會(huì)將所有符合格式的內(nèi)容都篩選出來(lái)多望,不容易具體查出我們需要的內(nèi)容。
它的優(yōu)點(diǎn)就是比較簡(jiǎn)單氢烘,對(duì)于一些固定的內(nèi)容可以起到很好的判斷作用怀偷,比如下面第一條斷言
,這個(gè)可以基本斷言出請(qǐng)求是成功的播玖,另外對(duì)于首頁(yè)樓層之類的信息也很適合用響應(yīng)斷言椎工。
在寫完正則斷言后,要驗(yàn)證它的正確與否,可以在結(jié)果樹中维蒙,將結(jié)果顯示類型改為RegExp Tester掰吕,然后將斷言復(fù)制到下方的Regular expression中,點(diǎn)擊Test就可以看到匹配的結(jié)果木西。
Bean Shell斷言
使用了響應(yīng)斷言之后畴栖,可能能夠解決一部分的檢查點(diǎn),但是肯定還有很多檢查點(diǎn)是通過(guò)響應(yīng)斷言覆蓋不了的八千。這里給大家介紹另外一種斷言的方式,Bean Shell斷言燎猛,說(shuō)白了也就是通過(guò)寫代碼來(lái)解析返回的JSON字符串恋捆,提取有用的信息,進(jìn)行相應(yīng)的檢測(cè)重绷。我對(duì)于Bean Shell的腳本語(yǔ)言也沒有什么了解沸停,基本都是使用簡(jiǎn)單的JAVA代碼來(lái)實(shí)現(xiàn)的(真的是很簡(jiǎn)單的代碼,除了if還是if昭卓,連else都沒有)愤钾。在響應(yīng)斷言里實(shí)現(xiàn)不了的功能,也基本都可以通過(guò)代碼來(lái)實(shí)現(xiàn)候醒。
1能颁、JSON的基礎(chǔ)結(jié)構(gòu)
要解析JSON字符串,就要對(duì)JSON做一定的了解倒淫,實(shí)際只要知道JSON的基礎(chǔ)結(jié)構(gòu)就可以伙菊。JSON有兩種結(jié)構(gòu),對(duì)象和數(shù)組敌土,通過(guò)這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)镜硕。希望大家能夠自己百度了解下JSON的結(jié)構(gòu),下面大概對(duì)JSON的基礎(chǔ)結(jié)構(gòu)介紹一下返干,僅供參考兴枯。
對(duì)象:表示為用"{}"括起來(lái)的內(nèi)同,其數(shù)據(jù)結(jié)構(gòu)為{name1:value1矩欠,name2:value2财剖,…}的鍵值對(duì)的結(jié)構(gòu),name為屬性名晚顷,value為對(duì)應(yīng)的屬性值,這個(gè)屬性值的類型有數(shù)字瞳氓、字符串、對(duì)象匣摘、數(shù)組幾種店诗。如下圖的例子音榜,返回的JSON字符串中,result就是一個(gè)對(duì)象赠叼,其中的city擦囊、address嘴办、title等都是對(duì)象的屬性值。
數(shù)組:表示為用"[]"括起來(lái)的內(nèi)容贯被,其數(shù)據(jù)結(jié)構(gòu)為[object1彤灶,object2批旺,…]朱沃,其中object是JSON對(duì)象。如下圖中的例子搬卒,result表示的是一個(gè)數(shù)組翎卓,它的第0個(gè)和第1個(gè)元素分別是一個(gè)對(duì)象失暴,對(duì)象中又有各自的屬性逗扒。
經(jīng)過(guò)對(duì)象古戴、數(shù)組的組合就可以組成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了现恼,明白了上面兩點(diǎn),就基本夠用了始锚,JSON的解析就是一個(gè)不斷深入尋找所需信息的過(guò)程瞧捌。
2润文、Bean Shell斷言編寫
Bean Shell斷言實(shí)際上就是通過(guò)對(duì)JSON字符串的解析找到需要檢測(cè)的數(shù)據(jù)進(jìn)行相應(yīng)的檢測(cè)比對(duì)的過(guò)程转唉。下面通過(guò)一個(gè)例子來(lái)具體說(shuō)明下其編寫方式。
因?yàn)槭謾C(jī)APP上會(huì)顯示商店名稱、商店圖片砖织、營(yíng)業(yè)時(shí)間侧纯、商店評(píng)分和滿免運(yùn)費(fèi)的信息甲脏,所以這里我們對(duì)這些信息做一下檢查块请,在請(qǐng)求返回的JSON結(jié)果中找到對(duì)應(yīng)的字段:storeName墩新、imgUrl、serviceTimes绵疲、shopFreeFreight和scoreAvg盔憨。
在HTTP請(qǐng)求點(diǎn)擊右鍵郁岩,選擇Bean Shell斷言驯用,添加Bean Shell元件。
添加完成后就可以開始編寫B(tài)ean Shell腳本了记餐,這里的代碼就是對(duì)上方JSON返回串的解析片酝,其中JSONObject是前面所說(shuō)的對(duì)象雕沿,JSONArray就是數(shù)組了猴仑。里面輸出的錯(cuò)誤信息會(huì)輸出到Jmeter剛打開時(shí)后面的那個(gè)黑框里辽俗。其余的JAVA語(yǔ)句都是很常用的if崖飘、for語(yǔ)句,相信只要明白了JSON結(jié)構(gòu)吊圾,編寫這里就很easy啦项乒!
當(dāng)然了板丽,為什么不用一些更復(fù)雜的代碼實(shí)現(xiàn)更強(qiáng)大的功能呢趁尼,原因有兩個(gè)酥泞,一個(gè)是我的編碼水平還很有限芝囤,以后會(huì)不斷學(xué)習(xí)增加代碼實(shí)現(xiàn)的功能,另一個(gè)原因就是Jmeter里的Bean Shell感覺比較low羡藐,如果代碼出現(xiàn)錯(cuò)誤(語(yǔ)法錯(cuò)誤之類的)仆嗦,很難定位到是什么地方出現(xiàn)了問(wèn)題瘩扼,所以簡(jiǎn)單的代碼能夠讓你更容易地運(yùn)行和維護(hù)代碼。
四规辱、網(wǎng)關(guān)腳本
這個(gè)教程可能還是會(huì)漏掉很多東西罕袋,大家在一開始編寫腳本的時(shí)候可能還會(huì)遇到一些不懂的地方炫贤,這個(gè)可以去git上下載我最新上傳的腳本以供參考付秕,或者直接來(lái)問(wèn)我就好询吴,腳本地址:
1.4.1線上地址:http://source.jd.com/app/gateway-auto-ant141
1.4.1預(yù)發(fā)地址:http://source.jd.com/app/gateway-auto-ant141-pre
因?yàn)槟_本經(jīng)常會(huì)Cookie過(guò)期或者有新的更新猛计,所以git上的腳本會(huì)實(shí)時(shí)更新奉瘤,當(dāng)發(fā)現(xiàn)腳本出現(xiàn)大量錯(cuò)誤的時(shí)候煮甥,試試去git上下載份新的腳本試試看成肘。