自動化測試中基于WinDump的抓包工具實現
在客戶端的功能測試過程中,常常需要驗證URL請求是否發送,參數是否正確。市場上有不少的網絡數據分析工具,smsniffer、wireshark、fiddler......他們可以很好的輔助我們完成驗證的工作。但是,在自動化測試的過程中,無法再依靠肉眼檢查來完成相關的驗證。通常的做法,可以在本地Mock一個服務器,再又服務器將請求的數據返回給客戶端來進行驗證,這在接口測試中比較有效。但是在功能測試的過程中,需要額外的編寫一個工具,完成相關的代理轉發工作,本身是一件略有難度的事。因此,團隊在測試的過程中考慮通過另外的方法去捕獲客戶端程序發出的請求和響應。
設想的方案的是利用現有的工具,生成網絡監聽數據后,再通過 TCP/IP + HTTP 協議反向解析出請求數據和響應數據。通過調研選定了Windows平 臺下的網絡監聽工具WinDump(該工具是Window平臺下一款出色的開源的輕量級網絡監聽工具)。通過實驗及對WinDump文檔的研究,確定了抓 包時使用的參數:WinDump.exe -i N -s 0 -w file_name -a host host_name其中:
-i 表示監聽的網絡端口編號
-s 0 表示捕獲完整的數據包
-w file_name 輸出到文件file_name中
-a 使用Ascii編碼輸出數據包
host host_name 只捕獲與host_name間的通信數據包。
通過這些參數,WinDump生成的數據文件格式是穩定的,包含完整的MAC、IP、TCP層的完整數據,是可以反向解析的。根據相關協議的文檔和生成 文件的數據比對,確定生成的文件格式為:24字節未知數據 + 16或者22字節的未知數據 + MAC幀 + IP幀 + TCP幀 + 數據幀,第2、3、4、5、6部分每個數據包都會重復出現。此外,通過比對,工具會生成完整的三次握手數據。
在分析完數據文件的格式 后,就可以通過編碼去分拆數據包了,去除未知數據后,把有用的數據包提取出來,并解析出其中的數據幀。并通過請求發送的端口和目標端口,對并發數據做完整 的對應關系(Request的端口是動態的,服務器會根據請求的端口將相應的Response返回給請求端口)。最后提取出關鍵的請求和響應的數據幀存儲 起來。這里是一份基于Ruby語言的捕獲http數據包和正則驗證數據請求存在的輔助類實現代碼。在輔助類中通過正則表達式去拆分Http請求及相應中的相關參數,并進行存儲。通過對外的接口獲取相關的請求和相應,后面想做什么,就隨心所愿了....
最后有一些需要改進的地方:1、如果能在請求時能過濾一些不Care的數據(例如未知數據、三次握手的數據),這樣最好了。2、需要根據數據分包標志完 成數據包的拼接(TCP協議中對數據包的大小做了一些限制,因此在數據包超過協議長度時會分為多個數據包傳輸,需要通過偏移量完成完整數據包的還原工 作)。
posted on 2013-01-10 13:39 順其自然EVO 閱讀(718) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄