Rational Robot可被用来对包含数据关联的复杂Web应用进行性能测试。这里所谓数据关联,是指Web页面之间存在的数据相关性,例如一个动态的页面URL或者个别输入参数需要从前一个页面中抽取出来,有时候还需要在抽取得到的结果的基础上做进一步处理。这就使得测试开发员通常必须对Robot自动生成的VU脚本进行修改从而保证其能正确运行。简单情形下,VU语言库提供的一些库函数可以支持常见的抽取需求。但在很多更复杂的情形中,往往需要通过更多的编程来处理页面之间的数据关联,包括进行模式匹配、模拟Java Script或者Java Applet的行为等。本文将介绍处理最常见的几种数据关联的方法,并提供了一系列很有用的功能函数,帮助测试开发员编写更具灵活性的VU脚本。
简介
随着越来越多的企业应用被移植到Web上,Web应用正变得日益复杂。它们被用来实现复杂的业务流程例如交易甚至工作流。一个业务流程通常包含若干步骤。这些步骤间自然地需要共享某些数据以完成一次连续的“计算”。例如,某一个步骤的输出可能是下一个步骤所需的输入。在一个典型的Web应用实现中,业务流程的每个步骤对应为一个HTML页面,因而最终用户将与一系列连续的页面依次交互以完成一个完整的业务流程。由于Web的无状态特性,这些页面中通常需要存储一些信息来实现它们之间所需的数据共享,例如下一个页面的URL以及其他可能的输入参数等。这些信息常常是由服务器动态生成,因此每次的值都可能不同。但是,当Robot录制一个HTTP会话时,它只能记录这些数据在这个会话中的一个快照。尽管Robot采用了一种称为“动态数据关联”(Dynamic data correlation)的技术使得它能够关联部分动态的值,但还是无法找出所有需要关联的值并据此产生具备完善功能和足够灵活性的VU脚本。即使Robot可以简单地认为所有的数据都是动态的,如何在可用的HTML页面中抽取甚至构造这些数据的值则是一个更加复杂和困难的问题,因为Robot对这些数据后隐含的逻辑一无所知。因此,在Robot不能产生令人满意的VU脚本时,就需要手工修改进行完善。
下面将首先对Web应用中的数据关联作更进一步的剖析,接着介绍如何使用Robot的“动态数据关联”技术,然后详细讨论当Robot不能产生满意的脚本时一些可能的解决方案,包括动态数据值的定制抽取和客户端数据构造的模拟等。
Web应用中数据关联的分析
在Web应用中,当一个特定的HTML页面的URL或者个别输入参数的值是动态产生因而必须从先于它返回的页面包含的数据中抽取或者构造出来时,就发生了数据关联。动态输入参数的一个很好的例子就是当前很普遍的“Session ID”,它由服务器生成并返回给用户的浏览器,在访问下一个页面时这个ID需要被发送回去以获取存储在服务器端的会话上下文。输入参数通常以四种方式提交:HTTP头参数、Cookie、URL参数和FORM参数。由于URL参数可被认为是URL的一部分,因此可以认为有四种可能发生关联的动态数据:HTTP头参数、Cookie、URL、FORM参数。在Robot的VU语言中,一个HTTP请求是通过调用库函数“http_request”发出的,列表1是给出了一个典型的用例。请注意列表1中各粗体部分,它们分别代表了四种可能发生关联的动态数据的形式中的一种。
列表1. 函数http_request的典型用例
http_request ["t3079"]
"POST /pkmslogin.form HTTP/1.1\r\n"
"Accept: image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, applicat"
"ion/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, ap"
"plication/x-shockwave-flash, */*\r\n"
"Referer: " SgenURI_009 "\r\n"
/* "Referer: http://gclgtod.cn.ibm.com/wps/myportal?lang=en_US" */
"Accept-Language: en-us,zh-cn;q=0.5\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)\r\n"
"Host: gclgtod.cn.ibm.com\r\n"
"Content-Length: 55\r\n"
"Connection: Keep-Alive\r\n"
"Cache-Control: no-cache\r\n"
"Cookie: w3sauid=d002000000001363710753854620000923482.0009B551AB;PBC_N LSP"
"=en_US; msp=alreadyOffered;JSESSIONID=0000fRBw1aq9nolhnP9ZMKhaw2B:- 1; "
"PD-H-SESSION-ID=4_oxjUZgfvY4ToFOhh9cFnnAg54o4sndHOA6rRkqpxbT2NAAAA\r"
"\n"
"\r\n"
"username=admin