性能测试从零开始—LoadRunner入门十二[2] 性能测试工具
我们发现,完全可以把图灵试验应用到我们的VU模拟场景中:
在软件系统运行时,一个真实的用户通过操作软件客户端来发起和服务器的会话请求,同时,一个VU开始运行它的脚本,也发起了同样的请求。被测服务器在处理各个“交谈”请求并与之分别会话的时候,并不知道哪些请求是来自真实的用户,哪些是来自VU。这样,VU成功地模拟了真实的用户,“骗过”了被测服务器。当然,VU要实现这个目标,之前还需要通过认证,构造合法的请求等步骤,这些VU都要加以实现。
我们弄明白了观察者是被测服务器这件事情后,有些知识点就清楚多了。
事实:VU是基于网络协议的。
很明显,被测服务器是通过各种各样的网络协议与客户端打交道的。VU要“骗过”被测服务器,当然就要遵守这些协议,按规矩、按步骤来动作,否则就会吃“闭门羹”,毫不留情地被服务器拒绝。实际上,如果我们留心的话,可以发现VU每个协议相关的函数都是紧紧围绕其网络协议的实现的。同样,VU录制生成的也是网络协议层次的脚本。在回放时,VU将按照录制下来的网络事件,一一重放。
基于网络协议的脚本的一个好处是,我们可以使用相对少的硬件资源,来生成大量的虚拟用户负载。相比之下,WinRunner和QTP的脚本是基于界面事件(GUI)的,它在一台主机上同时只能运行一个虚拟用户的脚本,因为一个虚拟用户会占用整个主机的资源。
推论一:VU不关心用户在界面上发生的事情。
真实的用户对软件客户端可能有各种各样的操作,有些会触发对服务器的请求,有些则不会。而VU的录制和运行都是基于网络上的事件的,因此VU在录制的时候,只对那些网络事件感兴趣,如果有网络交互发生,就会记录成脚本,没有则只会生成一个空脚本,尽管可能用户在界面上做了很多操作,比如鼠标移动,填写Web form里的数据。
推论二:VU中的操作关联与界面上的操作关联是不一致的 软件测试
在我们对软件系统进行测试的过程中,某些操作是相关联的。例如,我们测试“查看客户交易历史明细”这个事务的系统响应时间,按界面测试思路,我们会这么做:
首先用客户查询系统,查询出此客户。
点击这个客户,打开另外一个页面,展现此客户的基本信息。
点击基本信息中的“交易历史明细”,系统经过查询后,刷新此页面,显示明细结果。
显然,在UI测试中,我们要测试第三步骤,之前必须要完成第一步和第二步。但在VU中就不是这样了:
这三个操作被VU记录成三个函数。如果它们是上下文无关的函数(关于上下文相关和上下文无关函数,可参看LoadRunner函数手册),那么其实,我们完全可以忽略掉第一和第二个函数,只执行和参数化第三个函数。
案例
疑问:使用LoadRunner录制一个Java applet技术的Web系统,要录制的动作是:
点击一个按钮后,此时系统调用applet小应用程序。
applet小应用程序在本地加载完后,弹出一个通过XML文件配置对话框,在这个页面中建立节点树。
无论LoadRunner采用Web协议、Web Service协议还是Windows Socket协议,在脚本录制并回放后,到系统中一检查,发现节点并没有创建,这是怎么回事?
解释:
根据推论一,我们知道VU只捕捉网络上的事件,在本案例中LoadRunner采用Winsocket协议也无法创建节点,这说明XML树节点的创建是由Java applet完成的,并且很可能只保持在客户端本地,并未有和Server同步的迹象。因此,LoadRunner脚本捕捉和回放的脚本只是网络事件,并不会对客户端本地产生影响,节点自然不会被创建。
根据推论二,如果我们的目标是测试服务器的性能,那么完全可以忽略这个问题,继续录制。
提示:基于GUI和基于协议的测试工具在实质上是看待同一事物的不同的角度。比如:用户点击一个Web页面上的“无忧测试“的链接文字,在QTP会被记录成link("无忧测试").click的函数,而在LoadRunner中则会被记录成web_link函数。前者是记录“鼠标在此链接上点击一次”这个事件,而后者是“客户端向Web Server发起了一个get URL地址为www.51testing.com的请求”。LoadRunner和QTP如摸象的盲人一样,各自从GUI和网络协议的角度来看用户点击的动作。而实际上它们所记录的只是用户操作整个过程的一部分。
提示:LoadRunner 8.1从SP2开始,VU协议族中新增了一个特殊的Vuser类型,叫做Web Click and Script,为什么说它特殊呢?因为它和其他基于网络协议的Vuser不一样,Web Click采用了QTP的技术,使得VU可以录制在界面上的一些操作。比如登录时填写用户名、口令这些动作都可以被记录成脚本。这在本书第10章中将会有所介绍。
把VU的实质弄清楚了之后,我们就可以放心大胆地使用它了。Vugen是个神奇的盒子,我们总能从盒子里拿到我们想要的东西。