跨主机的交互方式,必然涉及到网络(为了防止爱抬杠的同学挑刺,事先声明:本节提及的网络,均是基于TCP/IP网络)。在TCP/IP协议栈的4个层次中,模块间的交互方式主要是位于上面两层(传输层、应用层)。
有些软件系统,直接采用某种现成的应用层协议(比如HTTP)来进行跨主机的通讯。这时候,测试人员就只需关心该应用层协议,不用操心传输层是如何实现的。
还有一些软件系统,自己实现了某种专有的应用层协议。这种情况下,对测试人员的要求就比较高了——测试人员需要大致了解传输层的知识以及该专有应用协议的格式。
★ 基于Web接口的交互(HTTP协议)
由于这几年B/S系统大行其道,而B/S系统,总是离不开HTTP协议,所以俺首先来介绍它。
在B/S系统中,服务端(也叫后端)总是会提供一些Web接口给客户端(前端)进行调用。这种调用总是基于HTTP协议来进行。当你针对服务端进行灰盒测试,你需要模拟客户端的各种HTTP请求(既要包括合法的请求,也要包括各种非法的、无效的请求),然后再检验服务端返回的响应(Response)内容。如果响应内容不符合接口文档的约定,就表明该服务端模块出Bug了。
HTTP请求(Request),常用的主要是GET方式和POST方式。这两者的用途及区别,维基百科上已有,俺就不浪费口水了,直接说如何进行脚本编程。
◇ 使用内置的标准模块
在Python脚本中,内置了完善的模块(urllib和urllib2),以便于你操作HTTP协议。对于简单的使用,urllib就足够了。
比如俺想用GET方式抓取Google的主页,只需如下3行代码:
import urllib f = urllib.urlopen("http://www.google.com/") print f.read() |
如果想往某个Web接口POST数据,并得到服务端的返回内容,只需再增加1行代码(构造POST参数):
import urllib params = urllib.urlencode({name1:value1, name2:value2}) f = urllib.urlopen("http://xxxx/xxxx", params) print f.read() |
如果需要一些复杂点的功能(比如:操作cookie、使用带认证的proxy),urllib2就可以派上用场了。
◇ 使用cURL
俺博客的老读者,或许记得俺在09年初写过的一个帖子——cURL(优秀的应用层网络协议库) 。看完这个帖子,你就能领会到:cURL是一个非常牛X的网络协议库,支持很多种网络协议(显然也包括HTTP)。这么牛X的一个开源库,自然会有不少编程语言对其进行包裹。下面俺把cURL相关的脚本语言及其开源项目列一个表格。如果你不喜欢用Python,或许可以改用俺列举的其它脚本语言。
语言/平台 开源项目
Python pycurl
Ruby Curb
Perl WWW::Curl::Easy
dotNet libcurl.NET