级别: 中级 刘 奇, 软件工程师, IBM 陆 劼, 软件工程师, IBM
2009 年 4 月 20 日 IBM Rational Performance Tester(简称 RPT)是一款由 IBM 公司开发的、适用于 Web 应用程序的性能和可靠性测试工具。本文将向对 RPT 使用有所了解的读者展示了一些 RPT 高级应用:正则表达式的控制和校正、如何添加定制的 Web 请求、如何修改带有二进制数据的请求、错误控制、同一场景多个脚本的随机运行等。
IBM Rational Performance Tester 简介
IBM Rational Performance Tester(简称 RPT)作为一款由 IBM 公司独立开发的应用程序的性能和可靠性测试工具,它支持 Windows 和 Linux 操作系统,并且可以支持不同的浏览器,例如 IE、FireFox。其版本也不断更新,从 7.0 到 7.0.2,再到前不久推出的 8.0,许多新的功能也在不断的完善当中。目前,相当一部分用户正在使用 7.0.X 版本,本文的讲解也将基于这个版本,但是下面所介绍的内容同样适用于 RPT 8.0 版本。
正则表达式的控制和校正
正则表达式在 RPT 中具有举足轻重的作用,主要是应用在数据关联类当中。默认情况下,RPT 能做到一些基本的数据关联,但是由于 HTTP 请求之间关联的复杂性,RPT 有时候并不能为用户创建完全正确地数据关联。在文章 IBM Rational Performance Tester 和 HP Mercury LoadRunner 的比较 中提到过一些数据关联的方法,例如寻找合适的数据源来关联,或者利用 Custom Code。对于相对简单的关联来说,使用正则表达式关联是一种更为有效的方法。选择你想要修改关联的数据源,点击右键,选择 Properties。
如图 1 所示。你会发现 RPT 正是使用正则表达式来实现关联的,此时你或许明白你此时所要做的仅仅是修改一下正则表达式,而不必去辛苦的去寻找合适的数据源或者辛辛苦苦的去写 Custom Code。何乐而不为呢?
修改带有二进制数据的请求
或许在使用 RPT 过程中,我们碰到过如图 2 所示的情形。Data 域为 Binary contont data,此时你不能用 Ctrl+Shift+Space 或者 Ctrl + 左键来查看其中的内容。这是为什么呢?这是由于 Data 域中包含了二进制数据,例如图片数据,就会造成整个数据无法查看。假如我们要对 Data 域中的数据进行关联,无法查看内容就给我们带来很大的麻烦。
图 1. 设置正则表达式
笔者想出一种间接的方法能解决大部分相关的问题。众所周知,RPT 脚本是由一个个请求组成的,而每个请求则包含请求 URL、端口和请求数据。在这里,Data 域则包含了请求数据。为了能让 Data 域能供我们查看来进行各种数据关联,我们可以在录制脚本的时候发两次请求:第一次请求,里面并不包含二进制数据,当然,这个请求会失败!接着发第二次请求,里面包含二进制数据,这个请求应该成功。
图 2. 带有二进制数据的请求
图 3. 包含上传图片的页面截屏
例如图 3,某个网页,其中有一个上传图片的部分,而且必须上传图片,点击提交,才能完成此次请求。首先,我们填写该网页的其他部分,不上传图片,点击提交!接着上传图片,点击提交完成本次请求。
在录制好的脚本当中,你会发现有两次关于该页面的主请求,一次失败,一次成功。我们打开失败请求的 Data 域,完成所需要的数据关联部分,待一切都完毕之后,我们将第二次请求中的图片二进制数据拷贝到第一次请求Data 域中存放图片数据的地方。此时,你会发现这个请求的 Data 域立即变成图 2 所示的模样。最后,删除第二次带有图片数据的请求。因为当我们给因缺少图片数据导致失败的第一次请求添加了图片数据之后,此请求就成了一个正确的请求,此时第二个请求已没有存在的必要了。
错控制误
错误控制在性能和可靠性测试当中有着十分重要作用。RPT 对错误控制的处理不是十分的完善。当一个脚本在运行中出现错误,脚本剩下的部分将继续执行,这样后续可能会出现很多错误。
我们经常使用 RPT 中的 LOOP 结构,即将所有的页面放到了一个 LOOP 结构中,然后可以通过指定循环次数来确定其中的脚本循环执行多少次。当在其中某一请求处发生错误时,我们不希望 RPT 继续执行下去。为了弥补 RPT 这方面的不足,我们需要自己写一些简单的 Custom Code 来检查每个主请求的正确性,如图 4 所示。例如,对于登陆主请求,它登陆成功,页面会有“登陆成功”或者在某个位置显示用户名字等特征,我们可以跟据其返回内容是否有此类特征来判断登陆主请求是否登陆成功。如有,则继续执行;否则跳出此次脚本的执行。清单 1 演示了如何判断登陆主请求是否成功(这里,假设登陆成功后会出现关键字“成功登陆”)。
图 4. 带有错误控制的脚本示例
清单 1. 验证登陆请求 Custom Code 示例
//程序的输入参数为待验证请求的响应内容
import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;
public class Login implements
com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {
public Login() {
}
public String exec(ITestExecutionServices tes, String[] args) {
String response = args[0];
Stringvalue= "登陆成功";
Boolean isError = false;
try {
if (response != null && response.indexof(value) >=0 )) {
isError = false;
info = "Keyword Found";
}
else
info = "Keyword Not found";
}
catch( Exception e){
info = e.toString();
isError = true;
}
// 如果isError 为 true,中断此次脚本的运行
if (isError){
tes.getLoopControl().breakLoop();
//保存错误信息 info
... ...
}
return value;
}
}
|
如何添加定制的 Web 请求
RPT 作为 Web 应用程序的性能和可靠性测试工具,它允许用户手动添加定制的 Web 请求。右键点击页面元素:Add -> HTTP Request 或者 Insert -> HTTP Request (如图 5 所示),RPT 将弹出图 6 所示的对话框,用户可以选择已经存在的请求,也可以选择新建一个请求。
图 5. 添加 Http Request 示意图
图 6. 选择 Server Connection
图 7. HTTP Request Headers 示例
下面将简单的介绍一下如何创建一个新的请求。在图 6 中,用户需要选中选项 New Connection,并在 Host 和 Port 当中输入正确的地址和端口。选择 OK 之后,重要的一步是要填写 Request Headers 中的内容。在 Request Headers 中,有几项必须确保填写正确,如 Accept、Accept-Language、Accept-Encoding 等等。用户可以拷贝其他请求中所包含的 Request Headers 内容。
同一场景多个脚本的随机运行
RPT 允许用户在同一个场景当中利用随机选择器 (Random Selector) 来随机选择编写的多个脚本。除此之外,它还允许用户指定任一脚本被选中的概率。
添加随机选择器的方法:右击将包含随机选择器的场景 (Schedule) 中的用户组 (User Group),选择 Add > Random Selector。随机选择器的作用是随机运行一系列的脚本测试,保证一系列的测试能够以随机的顺序执行。这样,RPT 能够模拟现实用户的各种不同的操作,而这真是可靠性测试和性能测试的最终目的。权重(weights) 指的是随机选择器在一个迭代过程当中选中该脚本的概率。例如图 8 所示,假定随机选择器包含两个脚本:Browse 和 Bid,我们赋予Browse 的权重为 7,Bid 权重为 3,那么在每一次循环当中,Browse 有 70% 的概率被选中,而 Bid 有 30% 的概率被选中。
图 8. 随机选择器示意图
下面介绍一下如何通过权重来计算每一次循环当中被选中的概率。一个随机选择器当中可能包含很多被赋予不同的权重的脚本,用户可以通过一脚本权重除以总权重来计算该脚本在一次循环当中被选中的概率。例如,假定随机选择器包含6个脚本:
-
脚本 1 和脚本 2 权重为 1
-
脚本 3 权重为 2
-
脚本 4 和脚本 5 权重为 5
-
脚本 6 权重为 9
在这个例子当中总权重为:1 + 1 + 2 + 5 + 5 + 9 = 23。所以每个校本被选中的概率为:
表 1. 脚本被选中概率的计算
表 1. 脚本被选中概率的计算|
脚本
|
每次迭代被选中的概率
| |
脚本 1 和 脚本 2
|
1/23 = 0.0435, 即 4.35%
| |
脚本 3
|
2/23 = 0.0870, 即 8.70%
| |
脚本 4 和脚本 5
|
5/23 = 0.2174, 即 21.74%
| |
脚本 6
|
9/23 = 0.3913, 即 39.13%
|
值得注意的是,通常情况下,通过增加权重可以提高一个脚本被选中的概率,但这仅仅适用于大规模的测试。例如,假如运行 23 次迭代,RPT 并不能保证脚本 1 和 2 就只运行一次,同样也不能保证脚本 6 运行 9 次。也就是说可能会出现脚本 1 和 2 运行 9 次,而脚本 6 只运行一次的情况。当执行的迭代次数越多,各个脚本被选中的概率就越接近表 1 计算得到的概率。
优化脚本录制
录制脚本的过程中,通常情况下我们应该禁止自动下载图片和运行 JavaScript 脚本。如果你是用 Firefox 浏览器,你可以通过“工具 -> 选项 -> 内容”来设置,如图 9 所示。当然,并不是所有的情况下都应该禁止自动下载图片和运行 JavaScript 脚本,例如用户需要这些资源作一些测试或者验证。
图 9. 配置 Firefox
Rational Performance Tester 脚本的移动
在测试过程中,我们经常需要重用自己所编写的脚本,这就涉及到脚本的移动问题。例如我们需要把 Windows 上的脚本移动到 Linux 上,有时候我们会发现我们写的 Custom Code 会有很多编译错误,这是因为 .classpath 没有配置正确。简单的方法是用编辑器打印 .classpath 文件。清单 2 列举了一些需要包含的库。用户可以通过更新这些库的路径来解决。
清单 2. .classpath 文件内容示例
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path=""/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/tools-core.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/common.runner.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/config.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/http.hexrecr.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/http.hextgen.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/http.runner.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/java.runner.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/manual.runner.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/org.eclipse.hyades.test.tools.core_4.2.3.v200701141614
/plugin.runner.jar"/>
<classpathentry kind="lib"
path="C:/Rtnl/SDP70Shared/plugins/
com.ibm.rational.test.lt.kernel_7.1.0.v200708311619.jar"/>
<classpathentry kind="output" path=""/>
</classpath>
|

 |

|
结论
通过以上的介绍,大家对正则表达式的控制和校正、如何添加定制的 Web 请求、如何修改带有二进制数据的请求、错误控制、同一场景多个脚本的随机运行等各种应用应该有一个简单的了解,也会发现 RPT 作为性能和可靠性测试工具不但具有强大的功能,也易于学习和使用。读者如欲了解详情,可以查看 RPT 的 Infomation Center 的相关内容。
参考资料 学习
获得产品和技术
讨论
作者简介  | |  | 刘奇是 IBM 中国软件工程师,现在 IBM 中国软件开发实验室 Lotus Notes Client 发中心工作。 |
 | |  | 陆劼是 IBM 中国软件工程师,现在 IBM 中国软件开发实验室 WebSphere Portal 发测试中心工作。 |
对本文的评价
|