级别: 中级 Chip Davis (chip.davis@us.ibm.com), 认证的技术服务专家, IBM
2007 年 9 月 07 日 IBM Rational Performance Tester 为了处理测试数据对 Eclipse 测试和性能工具平台(TPTP)数据池结构进行了调整。Rational Performance Tester 包括许多使这些数据池的利用变得十分容易和灵活的特性。一旦您开始使用了包含不止10,000行数据的数据池,无论如何都会在开始一个测试时有很长的延迟。对于大型系统的性能测试,您可以创建 Rational Performance Tester 测试,在存储和处理测试数据时使用的是文件而不是数据池。
介绍
测试数据在绝大多数软件测试中都是一个十分重要的部分,尤其是性能测试,它经常需要大量的测试数据。IBM Rational Performance Tester 为了处理测试数据对 Eclipse 测试和性能工具平台(TPTP)数据池结构进行了调整。Rational Performance Tester 包括许多使这些数据池的利用变得十分容易和灵活的特性。一旦您开始使用了包含不止10,000行数据的数据池,无论如何都会在开始一个测试时会有很长的延迟。对于大型系统的性能测试,测试数据需要一百万或者更多的记录是难于想象的。在这些情况下,TPTP 数据池可能是最有效的解决方法。
目的
这个分两部分的系列文章告诉您怎样创建 Rational Performance Tester 测试,在存储和处理测试数据时使用的是文件而不是数据池。这个方法可用于满足 Rational Performance Tester 性能测试中使用大量测试数据的需求。
在这个两篇文中组成系列的第 1 部分,您创建了一个附有数据池的测试。现在在第 2 部分,您将修改这个同样的测试来使用测试数据的文档,从而代替数据池。
注意: 这篇文章是使用 Performance Tester version 7.0.0 的。尽管特定的程序是可以改变的,但是它应该对以后的版本有效。虽然有些截图和程序可能并不完全相同,但是您还是可以使用 RPT version 6.1.2 来完成这篇文章。
使用 Rational Performance Tester 处理海量测试数据
您可以以一个简单的测试(带有一个数据池,用来容纳若干个搜索条目)来开始,它在这个系列的第 1 部分就已经创建了。这篇文章将向您介绍如何创建一个相同测试的新版本,这个版本将作为数据池使用相同的功能的测试数据文档。尽管这篇文章将仅仅用一个相对较少数据来演示,但是这个数据文档可以更有效地处理大批量的数据。
 | |
重要! 这篇文章中的例子将使用 IBM® developerWorks® Web 站点来记录和运行一个非常小的测试。这个 Web 站点不是用来作为加载测试站点的。请不要操作更多的用户负载或者重复超越文章规定的测试。 |
|
设置这篇文章的文档
这篇文章中包含有几个文档,如下所述:
- TestData.csv: 用来搜索字符串的包含50个随机名的文档。
- GetTestData.java: 一个完全的自定义代码代码模块,您可以从中进行拷贝和粘帖。
- SetupTestDataArea.java:一个完全的自定义代码代码模块,您可以从中进行拷贝和粘帖。
如果您在这篇文章的第 1 部分执行了这些步骤,这个文档应该已经下载并加压到您的C:\temp\地址;如果没有,现在就开始做。如果您将这些放到另一个地址,那么您将使用几个步骤来更新,这将在下面的部分指出。
Rational Performance Tester 自定义编码策略
您需要把代码添加到一个效仿 Rational Performance Tester 的内置数据池功能的测试中。这意味着您要成倍增加运行着相同测试的同步实例的模拟用户,对每个实例都要从一个文档中重新获取唯一的测试数据记录。每次测试实例从这个测试数据文档中获取一个记录,您需要在文档的这一行中有一个增量共享指针,从而使得下一个测试实例(模拟用户)可以取回下一行。
要使用一个共享行指针,您需要使用 Rational Performance Tester 的测试执行服务 IDataArea 接口,并在其它测试开始测试数据前在一个分离的测试中对它进行初始化。为了从一个文档中获取这个测试数据,您要使用简单的 java.io 方法,比如 StreamTokenizer。
为了简单起见,如果已经到达了文件的末端,您应该使这个行指针回到开始。您将在这个执行调度中处理并发事件,而不需要通过代码。为了在相同的机器上运行,这个执行还要求所有的用户访问一个指定的测试数据文档。可以用更多的机器为更多的虚拟用户服务,但是这些用户需要拥有他们自己的测试文档的副本。
使用一个测试文档为测试数据创建测试
按照以下的步骤创建一个测试和测试数据:
- 拷贝第一个记录的测试。
您将创建第二个测试,这将使用测试数据的原始CSV文档而不是数据池。由于您想要一个完全一样的测试步骤,那么您将不应该再次记录这个测试。您可以制作一个最初记录的复本,作为您的新测试。
- 点击
Create New Test From Recording 工具条按钮。
- 在 Create New Test 窗口中,选择 Create Test From Existing Recording 和 HTTP Recording,如图1所示。点击 Next。
图1.从一个现有的记录中创建一个测试
- 在 Create New Test From Recording 窗口中,选择 recording LargeTestData_datapool.rec,它在第 1 部分中已经记录(图2)。
图2.选择一个现有的记录来创建一个新的测试
- 在下一个 Create New Test From Recording 窗口中,选择这个测试文件夹,并键入
LargeTestData_data_file 的名称,如图3所示。点击 Finish 来创建一个新的测试。
图3.为这个新测试选择位置和名称
- 添加自定义代码来访问测试数据文档。
由于这个新测试是从最初的记录中产生的,它将不包含取代数据池数值的编辑。这样很好,因为您想要用来自文件的替换值来代替。这样做,您就会用到自定义代码模块。
- 通过右键点击 Test Contents部分的第二页(developerWorks: Rational : Products : Performance Tester)并选择 Add > Custom Code来添加一个新的自定义代码类到这个测试的 LargeTestData_data_file 中,如图4所示。
图4.添加自定义代码
- 这将在 Test Contents 部分中,标题为 IBM developerWorks > Search results 的搜索页面前创建一个自定义模块。如果这个自定义代码不是在最后一页之前,那么您可以使用这个测试编辑器的 Up 和 Down 按键来放置代码。
- 在 Class name域中键入
test.custom.GetTestData 的名称(图5),并点击 Generate Code。
注意: 确保在这个类名称的自定义之后键入一个点符号。这将创建一个名称为 custom 的包来包含您开发的代码。这样可以很容易地区分您的自定义代码和其它由这个测试包中的 Rational Performance Tester 创建的 Java™ 文件。文章建议您不要在这个测试包中编辑 Rational Performance Tester 产生的 Java 文件。
图5.自定义代码的命名和放置
- 在
GetTestData.java 类的 Code Editor 窗口中,键入下面列表中显示的代码。您还可以从内含的文章文件中拷贝。
列表1.获得文件行指针并初始化返回变量
列表2.打开文件,转到当前行,并获得值
列表3.更新新的行指针,并返回测试数据
GetTestData 代码执行一下任务:
- 从测试引擎(稍后就会安装它)数据区域中的全局变量获取当前最为结果储存但是当作整数使用的文件行指针。
- 使用打开这个测试数据文件进行浏览,并对其值进行分析(文件名称和路径是硬编码)
- 使用
nextToken 方法转到测试数据文件的当前共享行
- 为下一位虚拟用户增加行指针或者,如果已经到达文件的末尾,就回到这个文件的起始,使指针重新回到1
- 使用
sval 方法获取值
- 捕捉和处理潜在的文件和 IO 特例
- 将文件值返回到测试
注意: 可以在 Help 部分的 Extending test execution with custom code 中找到更多关于 Rational Performance Tester 自定义代码的信息。
- 除了这个测试编辑器中的 View Code 按钮外,您还可以通过打开 Navigator 视图浏览 \src\test\custom 文件夹 来打开和编辑自定义代码类,如图6所示。
图6.在测试外部打开自定义代码
您现在可以创建一个类来对这个共享文件行指针进行安装和初始化。由于一个自定义代码模块只能在一个测试环境中运行,因此您需要创建一个除了代码模块不包含任何其它东西的简单测试。您将创建一个空白测试来代替 HTTP 记录器的使用。
- 通过右键点击这个测试文件夹,并选择 New > Other > Test > Test Assets > New HTTP Test来创建一个新的空白测试,如图7所示。
图7.新 HTTP 测试
- 在 New HTTP Performance Test 窗口中,键入
LargeTestData_setup 名称,然后点击 Next。
- 键入一个描述并点击 Next。
- 在最后的 New HTTP Performance Test 窗口中,更改 Number of HTTP pages to generate 为
0 (零),如图8所示。
- 点击 Finish。
图8.创建一个空白测试
- 右键点击 Test Contents 区域并选择 Add > Custom Code 来添加一个新的自定义代码到这个测试中。
- 键入这个类名称
test.custom.SetupTestDataArea 如图9所示,然后点击 Generate Code。
图9. LargeTestData_setup 测试
- 在 SetupTestDataArea.java 类的代码编辑器窗口中,键入列表4中的代码行。您还可以从内置的文章文件中进行拷贝。
列表4. SetupTestDataArea 代码
SetupTestDataArea 代码执行以下任务:
- 创建一个变量
testDataRowPtr初始化为 1
- 将这个全局变量保存到测试引擎的数据区域,这样允许不同的测试和不同调度的用户组进行访问。
- 保存并关闭 SetupTestDataArea.java 和测试 LargeTestData_setup。
- 用一个代码返回值取代这个记录搜索值
您想要您的测试用测试数据来替换搜索值,与您在第 1 部分处理数据池类似,不同的是使用了由自定义代码返回的文件中的数据。
- 在 LargeTestData_data_file 测试中,展开 Test Contents 的最后一页,应该是 IBM developerWorks > Search 的结果。
- 选择 first request (被展开页面的第一行/节点)。 在 Request Attributes 部分的右边,您可以注意到显示的 URL 附有编码的参数,包括附有 RecordedSearch 的 "query=RecordedSearch” 是您在记录时输入的搜索字符串。这个值显示的背景是墨绿色,表明当前是由一个数据池值来取代的。
- 在方框中,右键点击 RecordedSearch 值域的任何地方,选择 Substitute From > Custom Code: test.custom.GetTestData ,如图10所示。这将把取代值从数据池值更改为自定义代码类的返回值。
图10.自定义代码值置换
- 在这个测试编辑器的 Test Data 部分,您现在可以看到项目查询已经被自定义代码 GetTestData 所取代,如图11所示。
图11.用自定义代码测试数据取代参数
- 右键点击 Test Navigator 视图中的调度文件夹,选择 New > Performance Schedule 来创建一个新的调度。
- 在 Performance Schedule 窗口中,键入
LargeTestData 名称,然后点击 Finish。
- 右键点击 Schedule Contents 部分并选择 Add > User Group 来添加另一个用户组。
- 键入这个组名称
Initialization 将这个组的大小更改为 Absolute 值为 1。如果这个组不在 Schedule Contents 部分的顶部,就点击 Up 按钮将它移动到顶部。
- 右键点击 Schedule Contents 部分中的 Initialization (1 user) 并选择 Add > Test 来添加一个测试到 Initialization 组中。
- 从 Select Performance Tests 视图中,选择 LargeTestData_setup 并点击 OK。
图12. Performance schedule Initialization 用户组
- 选择 Schedule Contents 区域中的组并在组名称域中输入
Users,从而更改其它用户组的名称。这个组的大小中的 Percentage 值应该仍然保持为 100。
- 右键点击 Schedule Contents 区域的 Users,选择 Add > Loop 从而添加一个循环到Users组。
- 选择循环,转到 Schedule Element Details 的右边,键入
3 作为重复的次数。
- 选择 Control the rate of iterations 复选框并键入重复率为
10 次每分钟,如图13所示。
图13.性能调度循环重复率
- 右键点击 Schedule Contents 区域的 Loop,选择 Add > Test。
- 从 Select Performance Tests 视图中,选择 LargeTestData_data_file(图14)并点击OK。
图14.性能调度用户组
- 在 Schedule Contents 区域的顶部选择调度名称 LargeTestData,设置这个调度选项。
- 在 Schedule Element Details 区域, General 键符上,选择 Add a delay between starting each user 复选框并键入
500 毫秒的时间延迟。
- 点击 Test Log 区域的 Schedule Element Details 键符来设置这个记录级别。将 Log Level 的 Log Level 设置为
Action Details,如图15所示。您可以忽略建议警告,因为这个测试将不会记录过多的数据。
图15. LargeTestData 的性能调度
重要! 正如先前所提到的,IBM developerWorks Web 站点并不是当作一个加载测试站点来使用的。请不要涉及超过这篇文章规定的用户数。同时,也不要涉及在完成这篇文章的必要步骤中不需要的重复的测试。
- 运行这个测试并验证使用的测试数据
- 通过点击
Run 工具条按钮来运行这个调度。
- 在 Run configurations 窗口中,编辑在这个系列的第 1 部分中创建的配置。
- 点击 Schedule 键符并选择这个调度 LargeTestData。点击 Run 开始执行。
- 在这个测试完成以后,右键点击 Performance Test Runs 中的 LargeTestData [date+time] 并选择 Display Execution History 来打开执行历史记录。
- 展开事件并验证这些查询值是不同的,并且匹配值是来自这个测试数据文件的。查阅这个系列的第 1 部分可以获得更多关于怎样操作的详细步骤。
使用文件存储测试数据的总结
在 Rational Performance Tester 中使用文件来处理测试数据,可以让您使用更大批量的数据,比如一百万数据或者更多,并且不用经历您使用类似规模的数据池时所遇到的长时间测试启动延迟的问题。
总结
虽然数据池是 Rational Performance Tester 中连接测试数据和测试最简单的方法,但是它们不能有效地处理大规模的数据(通常会超过10,000个记录)。为了克服这个困难,Rational Performance Tester 允许您直接(通过自定义代码)使用测试文件来处理您的测试中所要求的任何数量的数据。
这个技术的另一个优势是,除了运行测试的速度加快之外,还有您想要您的测试如何控制测试数据的附加灵活性。这篇文章仅仅演示了一个简单的性能测试,但是以后您可以加强、改进,并扩展其功能性。
您并没有被来自于 Rational Performance Tester 的编码能力所限制:因为所有的 Rational Performance Tester 代码都是用 Java,您可以为文件的处理,字符串的处理,或者其它任何实现您的测试目标所需的需求使用无数的 Java 库(许多开放源的)。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 50 random names used for search strings | TestData2.zip | 1 KB | HTTP |
|---|
| A completed custom code module | GetTestData2.zip | 2 KB | HTTP |
|---|
| A completed custom code module | SetupTestDataArea2.zip | 1 KB | HTTP |
|---|
参考资料 学习
获得产品和技术
关于作者  | |  | Chip Davis 是 IBM Rational 品牌服务组织的成员之一。在这一角色里,他引领着服务提供的开发和其他一些智力投资,这些通过使用 IBM Rational 工具、方法和解决方案促进了客户的业务工作并实现成功。自1999年以来,他已经为美国各种类型的客户部署了 Rational 解决方案。通过 chip.davis@us.ibm.com 可以联系到 Chip。 |
对本文的评价
|