3.4 重定向
当某请求的响应代码为 301,302,303,307 时,RPT 会自动将响应头中的 location 的真实路径作为引用,搜索后续请求的完整 URL,当发现匹配时进行自动关联,如图 5 示例:
图 5. 重定向 URL 自动数据关联
3.5 请求内容
如果请求内容中出现由 & 符号连接的“name=value”字段,则同 3.3 节,搜索最近出现的响应头或响应内容中的 name=value,进行自动关联,如图 6 示例:
图 6. 请求内容自动数据关联
如果请求内容为 XML 文档格式,即以“
图 7. XML 请求内容自动数据关联
4. 基于 Jazz 产品的数据关联算法
IBM 基于 Jazz 平台的软件应用产品是 Jazz Foundation Services 的扩展实现,其基于 REST(Representational State Transfer)规范,以 REST API 的形式提供数据和服务的访问,也就是说可以通过 HTTP 的 POST/GET/PUT/DETELTE 方法来实现数据的 CREAT/READ/UPDATE/DELETE。
图 8. 基于 Jazz 产品的数据关联
RPT8.1 针对 Jazz 协议提供了在 HTTP 协议基础上的默认的数据关联规则支持,如图 2。
对于完整的请求 URL,除了自动实施上述 HTTP 协议的通用关联规则外,还要搜索最近的响应内容中出现的符合正则表达式 (?s)
.*?src=\"(.*?)\",将 src 字段的值作为引用,从而实现自动关联,如图 9 所示:图 9. Jazz URL 自动数据关联一
对于请求头或请求内容中出现由 & 符号连接的“name=value”字段,除了自动实施上述 HTTP 协议的通用关联规则外,还要对 name 匹配,如果 name 以“id”(不区分大小写),“Area”,“uuid_versionable”,“Values”结尾,则向前在响应中搜索最近出现的 value 字段作为引用,实现自动关联,如图:
图 10. Jazz URL 自动数据关联二
5. 数据关联规则扩展
然而在 Jazz 产品性能测试的实践过程中,我们发现,由于采用了 web2.0 等新技术,脚本的请求变得愈加复杂,使得目前的数据关联规则不能满足需要,数据关联成为测试脚本编辑和调试的瓶颈。因此在实际测试项目实践的基础上,借助 RPT 提供的数据关联扩展功能,我们在测试生成过程中实现了针对需求的 RPT 数据关联扩展规则。
首先需要了解测试生成阶段的数据关联原理。自动数据关联的实现类为 DataCorrelator 类。在测试生成阶段,RPT 数据关联引擎调用其方法 CorrelateAll(),该方法将遍历每个数据关联插件,调用插件中的 findSubs() 方法,找到需要替换的变量和位置,并将其加入列表 subSites 返回。之后扩展插件的 findReference() 方法搜索关联源并生成引用,默认从被替换的位置开始,向上搜索,直到找到最近的相匹配的引用。如图 11。
图 11. RPT 自动数据关联原理图
因此,如果需要实现数据关联的扩展规则,则需要开发处符合自身被测试的应用需求的数据关联插件。本节将以自定义的插件 com.ibm.rational.test.lt.datacorrelation.testgen.rta(简称 rta)为例进行阐述,该插件应用于基于 Jazz 产品的性能测试,主要功能是按照用户定制需求,将 RPT 自动生成的某些数据关联去掉,同时生成一些测试需要的关联。
RPT 提供了与数据关联相关的扩展点:
com.ibm.rational.test.lt.datacorrelation.testgen.DCTestgenProto |
<extension point="com.ibm.rational.test.lt.datacorrelation.testgen.DCTestgenProto"> <dcProtoAdapter class="com.ibm.rational.test.lt.datacorrelation.testgen.rta.RTAProtoAdapter" generic="false" protoType="com.ibm.rational.test.lt.models.behavior.http.HTTPRequest" uniqueID="rtaProtoAdapter"> </extension> |
其中,point 为扩展点;protoType 为插件将要处理的协议的类型,例如 HTTP 协议为 com.ibm.rational.test.lt.models.behavior.http.HTTPRequest,因为基于 Jazz 的产品的性能测试是在 HTTP 协议的基础上处理的,所以该 rta 插件的协议类型亦声明为与 HTTP 协议相同;generic 是一个 boolean 型变量,如果取值为 True,在有多个插件共同处理同一协议类型时,此插件将会最后被调用;uniqueID 为该插件的唯一标识。