用Robot测试Websphere应用的性能──脚本修改
从开始用Robot做性能测试,目标程序就是一个基于Websphere的应用,至今两个月了,因此准备对Robot测试Websphere应用性能这一块做一些归纳,以求抛砖引玉。事实上,直到目前为止,仍存在不少问题,但就脚本这块儿来说,可移植性等方面已经基本解决,下面是一些总结内容。
首先,介绍一下测试的环境:Websphere Application Server和Portal Server部署在同一台采用windows 2003系统的PC上,数据库采用Oracle 10g,部署在Redhat Enterprise 4系统上,测试客户端为windows 2000英文版,采用的测试工具为Robot 2003,比较老的东东了。
首先我们采用录制的方式产生最初的脚本(事实上我一直希望能通过进一步的封装手写脚本,但目前受到进度等压力暂时搁置了),然后我们对脚本进行一些必须的修改:
第一,将脚本中http_nrecv ["***"] 后不是%%100的全部注释掉,因为robot的Vu脚本去掉头尾可以简单地看作三块的多个组合,即http_request, http_header_recv,http_nrecv,而由于有时候一个request会有多次分块recv,这样再回放的时候由于nrecv的是具体的字节数,当和录制时不符时就会报错,因此我们需要把他们都注释掉,仅留下%%100的那条,这样将一次返回所以服务器返回的数据,即我们在浏览器中看到的html代码,图片等。
第二,将脚本中的所有设计网站基本IP地址的地方用一个参数代替,以增强其可移植性。由于我们测试常在内网进行,因此基本地址往往是一个内网IP,由于服务器变更或测试环境变更(如改为外网测试)等因素,基本IP经常会变,因此将其参数化将极大减轻我们脚本的修改量。
第三,将think_avg超过一定值(我取的是1000)的替换为我们自己设置的delay函数,比如我自己写了setDelay函数,返回1-5s的随机值作为think time。
当完成上面这些步骤后,在服务器没有重新部署或者未移植的情况下,我们的脚本已经可以很好地回放了,事实上一开始我也只做到这一步,但是当我重新部署新的包或者将程序移植到另一台服务器上后,发现脚本大量地回放出错了,这说明脚本的可移植性还存在问题。
因此我们还需要对脚本进行修改,查看脚本发现,里面存在很多类似乱码的url,这是Portal Server加密过的url,而由于它是动态的,因此这种硬编码必将影响脚本的可移植性。所以我就有了最终目标和方向,即消除所有静态编码的url(乱码部分)。
其实大家做过网站开发的都会知道,当我们页面跳转时,目的页面的地址都可以通过当前页面得到,比如我点击一个提交按钮,目标网站就可以在当前页面这个 form的action中找到。而作为robot或者loadrunner等自动化测试工具所谓的动态关联,从本质上说也就是将当前页面的这个地址得到,并保存为一个变量,到下一次请求时就用这个变量代替我们录制到的url地址,而事实上这里我也是这么做的。
我发现会变化的url分两种,一种是css、图片、js代码等静态信息的地址,一种是基本ip后的加密过的地址。前者跟项目的部署有关,每次部署后都会改变,而后者则每次都变。
我们采用上面的思想,将这两个url做动态关联,后来发现该应用的form都采用相同的形式,我干脆写了一个方法,每次有html内容返回后,就在 http_nrecv 后面插入一个更新url的函数,而该url保存的参数我们设置为全局变量,以便各个脚本都能调用。
至此,我们的脚本已不存在可移植性问题了,但它仍不完善,举一点,在我们进行测试的时候,我们不知道测试进行到什么地方了,不知道搜索有没有返回正确的结果,不知道修改有没有正确完成,换言之,我们缺乏监控和验证代码。
在关键事务处,我添加了transaction和同步点,另外在关键事务点开始和结束后,我们添加display方法以便在运行时可以及时知道脚本的动向。而对于页面的内容验证,我们通过验证页面的返回中有无关键内容实现,如登录之后会显示“login success”,则在登录之后的http_nrecv后我们验证_response中是否包含"login success",是则pass,否则fail。
另外为了脚本的复用性等考虑,我们还将脚本采用分支分段方式组织,如将登录脚本独立出来,在存在简单、高级两种查询方式的选择时我们建立分支,让虚拟用户随机选择查询方式。
其实无论脚本怎么修改,其最终目的还是在模拟用户真实操作,因此需要我们自己编写相关函数去模拟用户行为。
以上即为我这两个月在脚本编写和修改方面的心得,我接触性能测试只有三个月时间,目前问题很多,尤其在websphere和oracle的调优方面,如果有哪位大虾有相关的经验,还望分享一下,先谢过了! 基本上到这脚本问题都差不多了
页:
[1]