【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

利用系统级别的mock进行测试

上一篇 / 下一篇  2010-04-14 21:42:35 / 个人分类:测试生涯

以前部门在测试相关的产品的时候,经常会遇到数据构造的难题。
比如A系统接受一个query,返回一个搜索结果。

实际的后台实现是A把query,比如MP3这个请求发送到B系统。B系统进行一定的算法计算,把结果返回给A。
A系统进过处理后再返回给客户。

这样,当我们期望可以覆盖A系统的某个功能点,或者逻辑路径的时候,就不得不依赖于B系统的计算.
而B系统的设计又非常的复杂,这样就导致了一个较大的瓶颈。
黑盒测试下,A无法轻易的通过自身的接口来测试自己的所有逻辑路径。因为B系统返回的结果,常常是未知的。每种返回结果,都会影响到B系统的返回。
研究出从A到B,再到A这个数据流是非常棘手的事情。导致了A系统的测试经常受阻。

不久前,我们那个天才级的主管提出了使用系统级别的mock来实现这种测试数据构造。就是直接构造一个mock系统。非常不错的想法。

让我想起了以前瑞星杀毒软件的一个漏洞。当时瑞星通过网络去激活相应的认证过程。
当时的瑞星,通过向瑞星的网站,发送一个包含特定header的http消息,服务端收到header中的数据,进行验证,然后再把验证结果返回给客户端。
有人就想出来一个妙招,就是修改host,屏蔽了真正的瑞星网站。自己使用asp搭建一个站点,把瑞星网站域名重定向到自己的站点上。然后在asp脚本中,直接返回一个验证成功的消息给客户端。这样杀毒软件就通过验证了。
当时读过那个文章后,感到作者果然是非常牛叉,太聪明了。
然后,就有人开始利用这种对付很多的正版验证,我知道的不多。好像当初的著名木马pcshare,就是这样被破解的。
很有创意。

今天,我们又重新回到了这个话题上。
我们如何构造一个假的服务,让A系统可以接收到所有的B系统的返回。从而可以覆盖大多数的逻辑路径。

我想大家已经有所启发了吧。

首先搭建一个http服务,然后自己写个同名的请求文件,可以是静态的,也可以是动态的。从而可以自由的定义输出。
以百度为例吧。

搜索
http://www.baidu.com/s?wd=阿里巴巴

我们假设,百度的首页,其实是个web展示系统,这个展示系统会调用百度后台的搜索引擎。
如果想测试这个web展示系统的话,搭建一个搜素引擎是ok的,但是我需要的数据,可能不一定能很好的得到。
比如有的时候,我想看看在百度搜索后,如果前N个字符内,有英文,或者特殊符号的时候,百度的摘要信息,是不是会超过2行的摘要。
去查找是不可能的,因为索引中可能没有这种类型的。但是不排除以后没有。去构造的代价又很大。需要修改数据源,然后经过一些列的“长途跋涉”,才能到前段。
又或者,百度的搜索引擎要进行升级,要增加一种新的输出格式,需要看看web端能不能兼容。在后台引擎没有完成研发任务前,前段即使开发完成,但是却一直会被block。导致测试不容易。

而通过系统级别的mock则可以轻易的解决这类的事情。


假如搜索阿里巴巴
实际query是http://www.baidu.com/s?wd=阿里巴巴
发送到百度的后台搜索引擎可能会变为  http://www.baidu.com/bin/search?query=阿里巴巴

那么我可以自己搭建一个http的服务器,然后在bin目录下,创建一个search文件。此文件可以自己定义。
这样。当web系统把后台引擎指向这个mock系统的时候,他就可以自定义返回内容了。
就可以轻松的控制返回给web系统的数据了。
这样很多测试就可以进展了。不必要非要等到后台搞定的时候才能进行前端的测试。



具体的执行

搭建http服务器。python -m CGIHTTPServer 80。很简单吧。
然后创建特定的路径即可。比如百度的。那就是bin/search这个文件。
我就可以轻易的在这个文件里面构造数据了。可以纯文本的,
也可以是根据query进行动态变化的。这是完全可以自定义的。


我以简单的mock百度的前端为例。

1、在hosts文件中添加
10.20.137.22  www.baidu.com
2、在特定的主机上,启动python -m CGIHTTPServer 80。 linux上需要使用sudo。创建s文件。可以是个文本,也可以是cgi脚本。都是可以的。也可以使用wget直接下载特定的网页。比如wget 'http://www.baidu.com/s?wd=阿里巴巴',然后重命名为s。
3、修改s文件,简单修改下。
4、访问 http://www.baidu.com/s?wd=baidu。
修改前与修改后的结果对比。

通过这样的原理,其实我们是可以模拟很多其他依赖的对象的,最终通过分离各个模块,实现更好的操纵数据的构造。从而覆盖更多的逻辑。










TAG:

 

评分:0

我来说两句

Open Toolbar