|
Rational Robot可被用来对包含数据关联的复杂Web应用进行性能测试。这里所谓数据关联,是指Web页面之间存在的数据相关性,例如一个动态的页面URL或者个别输入参数需要从前一个页面中抽取出来,有时候还需要在抽取得到的结果的基础上做进一步处理。这就使得测试开发员通常必须对Robot自动生成的VU脚本进行修改从而保证其能正确运行。简单情形下,VU语言库提供的一些库函数可以支持常见的抽取需求。但在很多更复杂的情形中,往往需要通过更多的编程来处理页面之间的数据关联,包括进行模式匹配、模拟Java Script或者Java Applet的行为等。本文将介绍处理最常见的几种数据关联的方法,并提供了一系列很有用的功能函数,帮助测试开发员编写更具灵活性的VU脚本。 简介 下面将首先对Web应用中的数据关联作更进一步的剖析,接着介绍如何使用Robot的“动态数据关联”技术,然后详细讨论当Robot不能产生满意的脚本时一些可能的解决方案,包括动态数据值的定制抽取和客户端数据构造的模拟等。 Web应用中数据关联的分析
正确处理数据关联的第一步是使用变量替换Robot录制的脚本中包含的动态数据的静态值,这些变量将在脚本运行时被动态地赋值。以列表1中的HTTP头参数“Referer”和FORM参数“login-form-type”为例,它们都由一个变量来赋值。但接下来的难题是:如何得到这些变量的值?一般有两种可能:一种是它们的值被直接包含在返回的HTTP响应中(包括响应的头和HTML内容)因而可以通过字符串抽取获得;另一种则需要进一步在抽取得到的若干值的基础上进行构造来获得。Robot能够自动地识别并抽取某些类型的动态值,这将在下一节中进行介绍。然而,目前它还不能发现所有这些动态值,更不用说根据一个未知的逻辑去构造一个值。因此,通常需要测试开发人员通过对VU脚本进行编程来定制变量值的抽取过程或者模拟某个数据构造过程。 这里需要澄清的是,动态数据和需要使用数据池(Datapool)的数据是不一样的。后者基本上是为了模仿最终用户的输入,它的值可以在脚本运行前确定并加载到数据池中(例如用户名和密码)。而本文中所指的动态数据大多是由服务器在运行时间生成和返回并需要在后续请求中以某种形式发送回去。不过,在某些非常特殊的情形下,例如当服务器对某个动态数据只生成一个有限集合的值(例如true和false)并且对用户会话不敏感,那么可以使用一个加载了所有这些可能值的数据池用于该动态数据的赋值,前提是能与服务器生成这些值类似的“逻辑”来从数据池中获得这些值(例如随机方式)。 使用Robot的“动态数据关联”功能 HTTP头参数 Cookie Robot能处理两种不同的Cookie:浏览器存储的Cookie和动态Cookie。对于浏览器存储的Cookie,Robot会在录制一个HTTP会话前查询浏览器存储的所有Cookie并将它们放在最后生成的脚本的COOKIE_CACHE部分中。Robot会把这些Cookie的过期日期设置为足够远的将来以保证在脚本运行的时候它们不会过期。当脚本被回放时,COOKIE_CACHE中的Cookie都会被加载到内存中使得回放过程尽量符合实际情况。整个过程都由Robot自动完成,不需测试开发人员干预。对于动态Cookie,即那些在录制脚本时由服务器返回的Cookie,Robot会将它们作为HTTP请求头的一部分保存在生成的脚本中(见列表1),但是在脚本被回放时它们的值会被替换为服务器实际返回的值——如果服务器确实有返回的话,否则就使用脚本中记录的值。 URL FORM参数 1. 点击菜单“Tools”->“Session Record Options”; 2. 点击“Generator per Protocol”标签,见图1; 3. 在“Correlate variables in response”设置区中,选择以下选项之一: a. All - 关联所有可识别的变量。 b. Specific - 只关联指定的变量。通过设置区中的“Add”和“Remove”按钮来指定需要关联的参数的名称。 c. None - 不关联任何变量。 如果选择了“All”或者“Specific”选项,那么生成的VU脚本中会包含若干对库函数“http_find_values”的调用。该库函数会找出由服务器返回并且最终用户不作修改的参数,然后抽取出它们的值并保存在一系列以“SgenRes_nnn”形式命名的变量中。举例来讲,列表2中包含了一个隐藏的FORM参数“mode”。Robot会确定该参数需要进行关联并生成相应的脚本代码(见列表3)来动态抽取它的值。 列表 2. 一个FORM样例
库函数http_find_values会在当前HTTP连接的响应中搜索所需的参数值。它的语法如下:
其中name指定参数的名称,type指定参数所在的数据形式,tag指定使用符合条件的第几个参数值。type的值应为以下值之一:HTTP_FORM_DATA、HTTP_HREF_DATA或HTTP_COOKIE_DATA,分别代表FORM数据、URL数据或Cookie数据。每一个name、type和tag的组合都唯一地确定了一个单一的值,调用http_find_values时最多可以指定21个这样的组合。宏CHECK_FIND_RESULT验证它返回的值不为空,若为空则提供一个缺省值,该缺省值是在脚本录制时记录的值。 可以发现,虽然使用了动态数据关联技术,Robot还是只能从FORM数据、URL数据或者Cookie数据中抽取参数值。如果动态数据的值被包含在其他地方,例如FORM中的“action”属性中,Robot就无能为力了。 参数值的定制抽取 列表4中定义的“getURLByText”函数可以通过指定一个字符串获得围绕该字符串的HTML Anchor标签的HREF属性。例如,getURLByText(“ Hello world! ”, “a surprise”)将返回“hello2.jsp”。如果第二个参数变为“surprise”,则返回“hello1.jsp”,因为该函数总是返回第一个被匹配到的结果。如果没有找到任何匹配,getURLByText返回一个空字符串。 列表4. 函数getURLByText
列表5中定义的函数“getURLByTextEx”提供了类似但更强大的功能。它允许使用VU语言所支持的正则表达式来指定目标Anchor标签所围绕的字符串的模式。例如,getURLByTextEx(“ Hello world! , “[Ss]urprise”)将返回“hello1.jsp”。 列表 5. 函数getURLByTextEx
列表6中定义的一系列函数可根据一个字符串的包围字符串、前缀或者后缀进行抽取。它们的名字暗示了其各自的功能。例如,假设列表2中的HTML内容被保存在系统变量“_response”中,那么通过调用getStringByBoundaries(_response, “action=\””, “\””)可以得到字符串“/search”;或者,也可以通过调用getStringByPrefixAndBoundary(_response, “/sea”, “\” name”)、getStringByBoundaryAndPostfix(_response, “action=\””, “ch”)或getStringByPrefixAndPostfix(_response, “/sea”, “ch”)来得到。这些函数也有相应的支持正则表达式的版本。 列表6. 一系列字符串抽取函数
上面介绍的所有这些函数都定义在文件“routines.s”中(见资源)。若要使用它们,请在Robot中创建一个新的空脚本然后将routines.s的内容粘贴进去。在其他脚本中,只要在文件头中添加下面这一行就可以使用上面介绍的函数了:
请将“newscript”替换为实际的文件名。 客户端数据构造的模拟
当HTML页面中包含JavaScript代码或者嵌入式组件例如Java Applet和ActiveX控件时,客户端的模拟就变得更为重要,因为它们常会被用来根据某一逻辑响应用户的操作在客户端动态地生成一些数据的值。客户端模拟的最直接有效的方法就是用VU语言实现由网页中的JavaScript或者嵌入式组件所实现的数据构造过程。但在这之前,通常需要先抽取构造所需的输入,上一节中介绍的函数会有助于此。举个例子,列表8中的HTML页面片断使用JavaScript来根据一个员工的名字动态地生成一个编码后的URL,列表9中的VU脚本片断模拟了这一URL的构造过程。 列表8. 包含JavaScript代码的HTML片断样例
总结 |
3_200703061740531
Tags:
您的评论
我来说两句
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为


最新评论
查看全部评论
评论总数 1 条