利用 Selenium 和 Rational Performance Tester 轻松实现 Web 性能测试

上一篇 / 下一篇  2012-10-13 11:10:32

引言

Selenium 是一套针对 Web 应用程序的自动化测试工具集,可以模拟单用户对 Web 应用程序的操作。本文利用 Rational Performance Tester(RPT)对已有 Selenium 脚本进行整合,利用 RPT 中的调度控制多个并发用户对某一 Web 应用程序进行访问,并监控关键事务的持续时间、CPU 等资源的运行情况,从而阐明了一种具有良好敏捷性和可维护性的 Web 应用程序自动化性能测试方法。

Selenium 和 RPT 技术简介

Selenium 是 Thoughtworks 公司开发的一套用于测试 Web 应用程序的工具集合。与其他测试工具相比,它的最大特点是可以通过录制或编写脚本,模拟真实用户利用浏览器与 Web 应用程序进行交互的种种行为。Selenium 脚本支持的浏览器比较广泛,包括了 Internet Explorer、Firefox、Chrome、Safari 等。支持的平台包括 WindowsLinux、Solaris 等。

通常情况下,软件测试人员利用 Selenium 主要进行以下两种自动化测试:

  • 软件功能测试:在脚本的运行过程中测试软件的主要功能是否满足既定的需求。
  • 软件兼容性测试:测试应用程序是否可以在不同的操作系统、浏览器下正常工作

Selenium 包括的组件有:

  • Selenium IDE:一个 Firefox 插件,通过录制用户对 Web 应用程序的基本操作,生成测试用例。在随后的测试过程中,这些测试用例可以在浏览器中进行回放。另外,可以利用此 IDE 将录制好的测试用例转换为 Selenium 脚本。
  • Selenium Server(Selenium RC Server):用来支持 Selenium RC 脚本或远程 Selenium WebDriver 脚本的运行。2.x 版本以后,Selenium Server 替代了以前的 Selenium RC server,但对其保持兼容。
  • Selenium Client Drivers:提供了一系列应用程序接口(API),用以创建与 Selenium Server 进行交互的自动化脚本。支持的编程语言包括 Java、C#、Ruby 和 Python。
  • Selenium IDE Plugins:用在 Selenium IDE 上的一系列插件,对其提供功能扩展。

本文的主要目的是通过创建 Selenium 自动化测试脚本,将其与 RPT 进行结合,从而增强性能的灵活性。所以读者只需要在 Selenium 的官方网站下载 Selenium Client Driver,当前基于 Java 语言的最新版本是 2.21.0。

Rational Performance Tester(RPT)是 IBM 公司的一款性能测试工具,针对软件产品的可靠性和可测量性,它帮助开发和测试团队创建性能测试用例、执行性能测试和分析。RPT 允许您使用任一种 Web 浏览器(Internet Explorer, Mozilla,或 Firefox)测试 Web 应用程序。通过录制测试脚本或者通过自定义代码编写测试脚本,利用调度将脚本组合在不同的用户组中。同时,您可以设置访问软件产品的虚拟用户数量,从而进行压力测试。RPT 在测试的执行过程中会实时生成易读性强,图文并茂的性能测试报告。这些报告强调了闭环性能瓶颈,事务比率和系统诊断。您还可以使用 RPT 指定来自硬件或软件组件中的性能瓶颈。本文中的例子基于 RPT 8.2.1.1。相对于其它性能测试工具,RPT 的用户界面易于上手而且操作简单,绝大多数操作仅仅通过界面编辑就可以完成,大大提高了性能测试人员的效率。

利用 Selenium 和 RPT 进行性能测试

本文主要利用 Selenium 和 RPT 对 IBM 产品 Decision Management 进行性能测试,下面简单介绍一下 Decision Management。IBM SPSS Decision Management 是一款立足于解决客户实际商业问题的企业级整体方案;是构建于 IBM SPSS Collaboration and Deployment Service 和 IBM SPSS Modeler 两大重量级产品之上,基于商业规则和数据挖掘算法的、可定制的预测分析产品。它主要包括了 Modeler Advantage、Customer Interactions、Claims 和 Rules Management 四大应用。


图 1. IBM SPSS Decision Management 登录后的界面
图 1. IBM SPSS Decision Management 登录后的界面 

图 1 大图

测试脚本的开发和集成

传统的性能测试是从录制脚本开始的,然而本文介绍的方法却与此不同,因此一开始在工程的创建上也有许多不同之处。下面,本文详细地介绍 RPT 工程建立,Selenium 脚本的开发以及如何将两者无缝集成起来的方法。

首先,在 RPT 的 Performance Test 视图下创建一个性能测试工程(Performance Test Project),RPT 会引导您进入一个工程向导,输入工程名如 DMPerfTest,之后选择所有的测试资源文件夹,这样有助于以后对不同的测试资源进行有效地管理。工程创建好后,RPT 会提示用户进行脚本的录制,这时只需 Cancel 掉这一步即可。因为我们不是通过录制 HTTP 脚本创建测试,而是在后面利用 Selenium 脚本去模拟用户的 Web 操作。


图 2.RPT 中选择多个测试资源文件夹界面
图 2.RPT 中选择多个测试资源文件夹界面 

然后,右击工程名 DMPerfTest 并在 Tests 文件夹下创建一个新的测试用例。赋予此测试用例一个有意义的名称,本文以 IBM SPSS Decision Management 的登录为例,所以测试用例叫做 login。特别注意,在测试用例的创建过程中将 Number of HTTP pages to generate 改为 0。填写 Web 应用的主机信息和端口信息,不用担心,这些信息在后面的过程中还可以修改。


图 3. 创建性能测试用例
图 3. 创建性能测试用例 

图 4. 不使用 HTTP 方式进行性能测试
图 4. 不使用 HTTP 方式进行性能测试 

此时,RPT 会默认地弹出一个测试用例编辑器。为了更大程度的进行复用,我们可以定义一些测试变量,这些测试变量是 Decision Management 的连接信息并且独立于 Selenium 脚本。

在测试用例编辑器的左侧单击"TestVariables",并在"Test Element Details"面板下方修改测试变量名为"DM Perf Variables"。接着通过点击 Add 按钮声明多个变量。


图 5. 修改测试变量名
图 5. 修改测试变量名 

图 6. 声明多个测试变量
图 6. 声明多个测试变量 

此时,我们已经创建好了测试需要的变量。右键点击测试用例 login,通过 Add->Custome Code 添加自定义代码。在测试用例编辑器的右侧设置 Java 代码的包名和类名,点击"Generate Code"创建代码。此时 RPT 会自动打开 Java 代码编辑器并创建一个自定义代码模板。类 LoginTest 实现了 com.ibm.rational.test.lt.kernel.custom.ICustomCode2 接口,此接口中唯一的函数是 exec(ITestExecutionServices tes, String[] args)。exec 函数是 RPT 脚本的入口点,如同通常 Java 代码中的 main 函数一样。


图 7. RPT 生成的自定义代码模板
图 7. RPT 生成的自定义代码模板 

既然 exec 函数是 RPT 脚本的入口点,我们就必须将一些初始化的代码放置于此函数的起始位置。初始化的工作包括:

  • 处理 args 数组中的内容;
  • 保存一份 ITestExecutionServices 对象的引用;
  • 创建一系列用于测试并提供报表、日志数据的 RPT 统计计数器。

前文中声明了多个测试变量,如 DM_HOST、DM_PORT 等,在测试用例设置面板将这些变量添加为自定义代码的变量,这样它们就可以按照声明的顺序传给 args 数组。当然,在这个地方读者还可以使用 RPT 中的数据池(Data Pool),具体用法可以参考其他 RPT 的文章或 RPT 的参考文档。


图 8. 为自定义代码添加测试变量
图 8. 为自定义代码添加测试变量 

清单 1. 使用 RPT 中的测试变量
private String id;
private String pw;
private String url;
…
private void initSiteData(String[] args) {
this.url = "http://" + args[0] + ":" + args[1] + "/" + args[2];
this.id = args[3];
this.pw = args[4];
}

为了利用 RPT 提供的应用程序接口(API),从而创建统计计数器、测试日志管理器、测试时间计数器等等,我们还要保存 com.ibm.rational.lt.kernel.services.ITestExecutionServeces 对象的一份引用。


清单 2. 保存 ITestExecutionServeces 对象
private ITestExecutionServices tes;
…
public String exec(ITestExecutionServices tes, String[] args) {
this.tes = tes;
…
}

利用 Selenium 和 RPT 进行性能测试的主要目的是为了得到某些关键事务的运行时间,如 login Web 应用的时间。因此本文主要利用 RPT 中的事务体时间计数器(Body Time counter)进行性能测试。


清单 3. 创建 RPT 时间计数器
private IStatTree timeStat;
private ITime timer;
…
private void initRPTCounters() {
IStatTree rootStat = tes.getStatisticsManager().getStatTree();
if (rootStat != null) {
	IStatTree tranStat = rootStat.getStat("Transactions", StatType.STRUCTURE);
	this.timeStat = tranStat.getStat("Body Time", StatType.STRUCTURE);
}
this.timer = tes.getTime();
}

代码中利用了 com.ibm.rational.test.lt.kernel.ITime 接口,使得脚本可以获得基本的时间信息并记录事务的运行时间。

为了测试出用户登录 Decision Management 的时间,本文采用 Selenium 脚本模拟用户登录 Decision Management Web 应用的这一行为,并利用 RPT 记录此事务的时间。具体步骤包括:

  1. 创建一个 RPT 事务;
  2. 创建一个事务体时间计数器,用以记录时间;
  3. 开始此事务;
    1. 执行 Selenium 脚本完成登录等行为;
    2. 利用 Selenium 脚本验证登录行为已完成。
  4. 停止此事务;
  5. 在时间计数器中记录此事务的时间。

清单 4. 登录 Decision Management 的性能测试函数
private void login() {
// 创建一个 RPT 事务
ITransaction loginTx = this.tes.getTransaction("justlogin");
loginTx.start();
IStat justLoginTimeDataStat = (IStat)timeStat.getStat("justlogin", StatType.RANGE);
long startTime = this.timer.timeInTest();
// 利用 Selenium 脚本,开始执行事务
this.driver.get(this.url);
this.driver.findElement(By.xpath("//td/input[@type='text']")).sendKeys(this.id);
this.driver.findElement(By.xpath("//td/input[@type='password']")).sendKeys(this.pw);
this.driver.findElement(By.xpath("//button")).click();
this.driver.findElement(By.xpath("//div[@class='quickLaunch-choose-area']"));
// 事务完成
long endTime = this.timer.timeInTest();
// 记录完成事务的时间
if (justLoginTimeDataStat != null) {
	justLoginTimeDataStat.submitDataPoint(endTime - startTime);
}
loginTx.stop();
}

函数的中间部分使用了 Selenium 脚本模拟用户输入用户名、密码,并点击登录按钮这一系列操作。Selenium 脚本主要利用 findElement 函数和 XPath 原理定位 HTML 元素,具体的使用方法读者可以参考 Selenium 官网上的文档。

调度与资源监控

Selenium 脚本只能模拟单个用户对 Web 应用程序的操作,为了模拟多用户对 Web 应用的并发访问,我们可以利用 RPT 中的调度功能。

在工程 DMPerfTest 的调度(Schedules)文件夹下创建一个调度,如 DMSchedule。默认情况下,RPT 会建立一个用户组 User Group 1,我们将上文中创建的测试用例 login 添加为 User Group 1 的测试,并修改 DMSchedule 的用户量(User Load)为 2,这样就可以模拟 2 个用户执行 login 的情况。当然,针对不同的性能测试需求,读者可以修改这个用户量。

在性能测试中,测试工程师往往需要监控某些机器的性能指标变化情况,从而发现性能瓶颈,或者进行多用户的压力测试。例如,在应用程序与大量用户的交互过程中,监控程序所在机器的 CPU、内存的表现,尝试发现内存泄露等问题,或者探寻某一硬件水平下程序支持的用户规模。RPT 对资源监控提供了完美的支持。在调度设置面板的资源监控(Resource Monitoring)选项卡中,测试工程师可以添加需要监控的机器。如下图所示,由于本文将 IBM SPSS Decision Management 产品安装于 svs1pf03.spss.com 的机器上,所以通过设置 RPT 的资源监控对话框,监控此机器的 CPU、内存性能指标的变化。


图 9. 资源监控
图 9. 资源监控 

在应用程序的实际使用过程中,尤其是 Web 应用程序,它会在同时接受到来自四面八方用户的访问。为了模拟这一场景,同时降低某一机器的负担,RPT 可以对不同用户组设置不同的代理(Agent)。为了利用这一功能,必须在相应的机器上安装 IBM RPT Agent Controller 产品。本文对 User Group 1 设置代理,使 User Group 1 下的 login 测试用例可以在 svs1pf03 上执行,如下图所示。在执行的初始阶段,RPT 会将工程的所有代码以及资源文件(如 Selenium jar 包等)重新打包,传送到代理机器上的指定文件夹,如 c:\IBM_RPT_Agent;脚本执行完毕后,将结果传回 RPT 用以生成性能测试报告。


图 10. 为用户组设置代理
图 10. 为用户组设置代理 

分析测试结果

点击调度面板上的运行(Run)按钮,等待一段时间,RPT 就会自动生成此次测试的性能报告。从性能报告中的概况(Summary)选项卡中可以看到,有两个用户完成了 login 这一事务,最短使用时间为 12.922 秒,最长使用时间为 13.688 秒,平均使用时间为 13.305 秒。


图 11. 性能报告中的测试概况界面
图 11. 性能报告中的测试概况界面 

在资源(Resource)选项卡中可以看到,随着用户执行 Decision Management 的 login 操作,svs1pf03 机器上的 CPU 和内存有了显著地变化。


图 11. 性能报告中的资源监控界面
图 11. 性能报告中的资源监控界面 

总结

本文以 IBM SPSS Decision Management 产品的性能测试为背景,主要介绍了将 Selenium 自动化测试工具与 IBM Rational Performance Tester 结合进行 Web 性能测试的方法。相对于"录制脚本 - 修改脚本 - 回放脚本"这一传统的性能测试过程而言,本文介绍的方法具备更好的敏捷性和可维护性,能够持续保证软件产品的性能满足目标要求。


参考资料

学习

获得产品和技术

  • 访问 Rational Performance Tester 产品专题,了解最新的 IBM Rational Performance Tester (RPT) 产品文档和产品信息,获得关于软件自动化测试的技术文档和参考资源,可以查阅产品概览、产品手册、产品技术支持、试用版下载,以及相关文章、教程、多媒体课堂和产品演示等信息。

  • 下载免费的 IBM Rational Performance Tester 试用版

  • 获取免费的 Rational 软件工具包系列,了解最新的 IBM Rational 软件开发工具技术文档和资源。

  • 下载更多免费的 IBM Rational 试用版软件,了解 IBM Rational 软件的最新特性。

  • 获取更多 IBM 试用版软件,并熟练掌握来自 DB2®、Lotus®、Tivoli®,以及 WebSphere® 的开发工具和中间件产品,用这些试用版软件开发您的下一个项目。这些试用版软件可以免费直接从 developerWorks 下载。

TAG: Rational Selenium selenium rational

 

评分:0

我来说两句

Open Toolbar