在客户端的功能测试过程中,常常需要验证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协议中对数据包的大小做了一些限制,因此在数据包超过协议长度时会分为多个数据包传输,需要通过偏移量完成完整数据包的还原工作)。