Fiddler+Jmeter+斷言詳細教程 html
在編寫網關自動化腳本以前,得先學會如何抓包,這裏以Fiddler爲例。會抓包的同窗能夠跳過這一步,固然看看也是沒壞處的……git
將要進行抓包的手機與電腦連入同一局域網,電腦纔可以抓到手機APP的請求,這裏介紹一種咱們在使用的網絡配置方法。web
首先使用電腦A佈置一個咱們抓包須要的局域網。下載獵豹WiFi(網上有不少這種工具360免費WiFi、百度WiFi等,隨意下載一個就好,這裏咱們以獵豹WiFi爲例),安裝完後建立一個WiFi便可。正則表達式
而後使用抓包的電腦B鏈接剛剛創建的WiFi,鏈接好後查看電腦B的IP地址。express
用測試手機鏈接剛剛創建的WiFi,在局域網設置中將其代理改成電腦B的IP地址,端口號:8888,保存便可。apache
Fiddler的安裝,在網上下載最新的版本就能夠,這裏給出一個我安裝的4.5版本的連接http://sq.jd.com/bFPg1z ,下載安裝,步驟就省略了,下一步..下一步便可。數組
安裝完成後打開Fiddler,在菜單欄Tools->Fiddler Options->Connections,勾選Allow remote computers to connect,默認的端口號爲8888,這裏不須要修改,在修改手機代理設置時注意與這裏一致。網絡
由於咱們所須要抓取的基本上都是京東到家有關的請求,因此咱們能夠設置只抓取咱們所須要的請求,如圖,選中右方Filters,在下方Hosts設置中選擇Show only the follow Hosts,而後填入咱們所須要抓取請求的Host,好比這裏填入的是京東到家Android線上和預發佈的Host。數據結構
到這裏Fiddler的基本配置就完成了,接下來就能夠開始抓包啦。app
本機IP:192.168.191.2
Fiddler端口號:8888
提示:在每次抓取時重複下步驟3中清空結果列表的操做,能夠更容易地找到須要抓取的請求。
這裏很難對Jmeter作一個全面的介紹,並且我也只是瞭解了一些皮毛,因此就在實例中一一介紹吧,全部配置齊全以後,就開始咱們的第一條腳本吧。下面的步驟說得比較詳細,比較囉嗦,請勿急躁。
注意:HTTP請求有GET和POST兩種,不一樣的請求記得選擇不一樣的請求方法!!!
這樣咱們的第一條Jmeter腳本就基本完成了,基本全部的HTTP請求都是大同小異,多練習寫幾條基本就能手到擒來了。結果樹和Cookie管理器每一個線程組添加一個就夠用了。
實際上,完成上面兩個步驟並不算是真正學會了腳本的編寫,由於腳本中最重要的一部分是它的斷言,斷言是來判斷網關返回JSON結果是否正確和完整的重要手段。下面的內容寫得比較囉嗦,麻煩你們必定要耐心點,別睡着!
在寫過一些腳本以後你們可能就會發現,所謂的寫腳本無非就是不停地複製,粘貼,複製,粘貼……因而你們確定會想一些讓本身能更快複製粘貼的方法。參數化的方法就能在簡化這個過程的同時讓你們更清晰地認識到URL的結構。
URL其實就是不少個參數組成的,而裏面的參數通常是會加密的,爲了更好地瞭解URL的結構,能夠對URL進行解碼,這個百度一下大把解碼工具能夠用,都是在線的,非常方便。這裏給個參考的連接http://meyerweb.com/eric/tools/dencoder/ ,URL粘進去點Decode便可。
解碼結果以下:
從解碼後的URL裏能夠看出其中不少參數的值,appName、signKey、screen、body等都是。通過對大量URL的分析,發現全部京東到家請求URL中有不少參數是不變的。更具體來講,根據請求的不一樣,只有signKey、body和functionId這三個參數是發生改變的,其他的參數,在帳號和手機設備不變的狀況下是不會發生變化的。這樣的話,咱們把那些不變的參數放在一塊兒統一管理,每次在寫新的腳本的時候,只須要改變那三個不一樣的參數就能夠了。
1)設置參數。在線程組右鍵選擇添加->配置原件->用戶定義的變量。
而後在定義變量的頁面點擊下方添加按鈕進行URL參數的添加,這裏參考解碼後的URL,將其中的參數逐一進行添加。從下圖中能夠看到,除了signKey、body和funtionId這三個參數外,其與參數都被添加。咱們也可以發現這些參數大都是和手機型號、系統、app名稱版本等信息有關的,只要手機設備不更換、到家版本不更新,這套參數是能夠一直用下去的。固然你們在使用本身設備和帳號的時候記得更新下這些參數。
2)給請求添加參數。回到到家首頁的HTTP請求,這時候咱們已經不須要在路徑的框裏粘貼上那條很長很長的URL了。那麼怎麼使用上一步中的參數呢?看了下面這張圖就明白了。這裏引用參數的方法是${參數名}。能夠看到下面的表中的參數是通請求一塊兒發送的參數,也就是說是這些參數組成了原來的那條很長很長的URL。
注意下圖表中框出的三個參數,就是前面一直在提到的每一個請求都不一樣的那三個參數,signKey、body、functionId。那麼之後再寫新的腳本的時候,只須要改這三個參數,其餘的地方都不須要改動。注意:下面的body參數是通過解碼的,因此應當勾選後面的編碼框。
說了這麼多,你們確定會以爲沒有必要這麼麻煩,直接複製粘貼不就行了麼,那麼下面就舉一個例子來體現下參數化的好處。按照上面的步驟設置添加好參數後,首頁的腳本應當是能夠運行了,下面咱們以首頁爲基準,來寫一條新的腳本,以秒殺頁面爲例。
第一步:使用Fiddler抓取秒殺頁面的請求,對URL進行解碼。注意標記的三個參數一會要用。
第二步:選擇"首頁"腳本,右鍵點擊選擇複製,選擇"京東到家"線程組,右鍵點擊粘貼,其實就是把首頁的腳本複製一份。因而線程組裏又出現了一個新的首頁。
第三步:選擇新複製的首頁腳本,將其名稱改成"秒殺頁面",而後把參數列表中的那三個參數改成第一步中對應的值,而後Ctrl+S保存就能夠啦。
是的,只須要這三步,就能夠完成一個腳本,整個過程不超過一分鐘。之後寫每一個腳本均可以用這三步實現。固然,後續給腳本加上斷言以後還須要改動斷言。
若是你是從開頭一步一步讀過來的,那麼你如今必定可以很快地寫出一條腳本,這時候就有一個問題出現了,腳本寫完了,能夠運行了,也能夠看到運行返回的結果了,那怎麼能知道返回的結果是否是正確呢?是否是完整呢?這裏先介紹一種簡單的判斷方式:響應斷言。
右鍵點擊HTTP請求添加->斷言->響應斷言。
這裏的響應斷言主要是針對HTTP請求返回的JSON字符串的,咱們通常使用的是包括斷言,就是返回的結果是否包含咱們須要的信息。斷言文本的截取能夠在運行結果樹裏進行,將結果顯示類型改成Text(固然也能夠JSON格式和Text格式對比着找),找出須要斷言的信息。
須要注意的是響應斷言支持正則表達式,這能夠對一些常常變化但格式固定的內容作一些斷言。下圖中最後一條斷言就是正則表達式,其內容表達的是秒殺剩餘時間是否大於0小於3600秒。這個能夠根據檢測點的須要去添加。想學習正則表達式的同窗能夠戳連接:http://deerchao.net/tutorials/regex/regex.htm 。
固然,響應斷言的缺點很明顯,它的格式過於固定,不能知足一些檢查點的需求操做,好比比較大小,檢查字段值是否爲空。還有就是正則表達式會將全部符合格式的內容都篩選出來,不容易具體查出咱們須要的內容。
它的優勢就是比較簡單,對於一些固定的內容能夠起到很好的判斷做用,好比下面第一條斷言,這個能夠基本斷言出請求是成功的,另外對於首頁樓層之類的信息也很適合用響應斷言。
在寫完正則斷言後,要驗證它的正確與否,能夠在結果樹中,將結果顯示類型改成RegExp Tester,而後將斷言複製到下方的Regular expression中,點擊Test就能夠看到匹配的結果。
使用了響應斷言以後,可能可以解決一部分的檢查點,可是確定還有不少檢查點是經過響應斷言覆蓋不了的。這裏給你們介紹另一種斷言的方式,Bean Shell斷言,說白了也就是經過寫代碼來解析返回的JSON字符串,提取有用的信息,進行相應的檢測。我對於Bean Shell的腳本語言也沒有什麼瞭解,基本都是使用簡單的JAVA代碼來實現的(真的是很簡單的代碼,除了if仍是if,連else都沒有)。在響應斷言裏實現不了的功能,也基本均可以經過代碼來實現。
要解析JSON字符串,就要對JSON作必定的瞭解,實際只要知道JSON的基礎結構就能夠。JSON有兩種結構,對象和數組,經過這兩種結構能夠表示各類複雜的結構。但願你們可以本身百度瞭解下JSON的結構,下面大概對JSON的基礎結構介紹一下,僅供參考。
對象:表示爲用"{}"括起來的內同,其數據結構爲{name1:value1,name2:value2,…}的鍵值對的結構,name爲屬性名,value爲對應的屬性值,這個屬性值的類型有數字、字符串、對象、數組幾種。以下圖的例子,返回的JSON字符串中,result就是一個對象,其中的city、address、title等都是對象的屬性值。
數組:表示爲用"[]"括起來的內容,其數據結構爲[object1,object2,…],其中object是JSON對象。以下圖中的例子,result表示的是一個數組,它的第0個和第1個元素分別是一個對象,對象中又有各自的屬性。
通過對象、數組的組合就能夠組成複雜的數據結構了,明白了上面兩點,就基本夠用了,JSON的解析就是一個不斷深刻尋找所需信息的過程。
Bean Shell斷言實際上就是經過對JSON字符串的解析找到須要檢測的數據進行相應的檢測比對的過程。下面經過一個例子來具體說明下其編寫方式。
由於手機APP上會顯示商店名稱、商店圖片、營業時間、商店評分和滿免運費的信息,因此這裏咱們對這些信息作一下檢查,在請求返回的JSON結果中找到對應的字段:storeName、imgUrl、serviceTimes、shopFreeFreight和scoreAvg。
在HTTP請求點擊右鍵,選擇Bean Shell斷言,添加Bean Shell元件。
添加完成後就能夠開始編寫Bean Shell腳本了,這裏的代碼就是對上方JSON返回串的解析,其中JSONObject是前面所說的對象,JSONArray就是數組了。裏面輸出的錯誤信息會輸出到Jmeter剛打開時後面的那個黑框裏。其他的JAVA語句都是很經常使用的if、for語句,相信只要明白了JSON結構,編寫這裏就很easy啦!
固然了,爲何不用一些更復雜的代碼實現更強大的功能呢,緣由有兩個,一個是個人編碼水平還頗有限,之後會不斷學習增長代碼實現的功能,另外一個緣由就是Jmeter裏的Bean Shell感受比較low,若是代碼出現錯誤(語法錯誤之類的),很難定位到是什麼地方出現了問題,因此簡單的代碼可以讓你更容易地運行和維護代碼。
這個教程可能仍是會漏掉不少東西,你們在一開始編寫腳本的時候可能還會遇到一些不懂的地方,這個能夠去git上下載我最新上傳的腳本以供參考,或者直接來問我就好,腳本地址:
1.4.1線上地址:http://source.jd.com/app/gateway-auto-ant141
1.4.1預發地址:http://source.jd.com/app/gateway-auto-ant141-pre
由於腳本常常會Cookie過時或者有新的更新,因此git上的腳本會實時更新,當發現腳本出現大量錯誤的時候,試試去git上下載份新的腳本試試看。