| 免费下载:IBM® Rational® Performance Tester 试用版 | IBM® Rational® 测试人员资源工具包 |
|---|
| 下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。 |
随着需求的不断变化,自动化正在变得日益复杂。要适应这一情况,我们需要以更加智能的方式开发自动化框架。决策控制是实现复杂自动化的关键概念之一。
在 IBM® Rational® Performance Tester 中,您可以将部分测试定义为 条件循环,也就是指运行指定次数的运行。您可以根据次数、时间 设置循环的持续时间,或将其设置为无限 次。但是,软件没有提供相应的方法来动态设置循环的目标值。Rational Performance Tester 初学者可能没有样例代码来迅速上手。因此,本文的目的就是帮助您实现一个条件循环。本文将带您遍历一个完整的条件循环自动化脚本示例。不过,这并不是实现条件循环的惟一途径。
在 Rational Performance Tester 中创建一个条件循环
循环的逻辑或控制部分位于自定义代码(Java 类),这些代码负责限制循环的迭代次数。
首先进行一个新的性能测试。下面的屏幕截图显示了如何执行每个任务。
在 Rational Performance Tester 中打开一个新的测试
请注意:
Create New Test Wizard 中只显示了几个步骤。对于其他步骤,向导屏幕假定没有修改默认值,因此您仅需单击 Next 按钮即可。
- 在 File 菜单中单击 New > New Test。
图 1. 创建一个新测试
- 在 Test File Name and Location 对话窗口中,为测试提供一个名称。对于本例,我将其命名为
LoopExample。
图 2. 提供一个测试名称
- 在 “Protocol and Features” 对话窗口中,只需选中 Core Features 复选框。
图 3. 选择测试协议和特性
- 完成 Create New Test 向导后,在打开的新测试的窗口中,单击 Add 按钮并选择 Loop 元素。
这将向测试添加一个循环元素。
提示:
您可以通过右键单击测试名称调用相同的上下文菜单(图 4 中的 LoopExample)。
图 4. 从 Add 上下文菜单中添加一个循环
- 选择新添加的 Loop 元素。
- 在右侧的 Test Element Details 部分中,在 Duration 下,从列出的选项中选择 Infinite 单选按钮。
图 5. 修改循环的默认持续时间
- 右键单击 Loop 元素。
- 从上下文菜单中选择 Add ,然后选择 Custom Code。
这些 Java 代码将根据一些极限条件控制循环的迭代次数。在我们的演示测试脚本中,我们将使用脚本中位于循环外部的一个类来为迭代次数获取一个随机值。
图 6. 向 Loop 元素添加自定义代码
注意:
在命名自定义代码时,请遵守命名规则。由于所有类在默认情况下都保存在同一个目录中,因此最好使用不同的名称空间来实现较好的可读性,以避免混淆。例如:
- customcode.com.ApplicationName.search.controlSearchLoop
- customcode.com.ApplicationName.create.controlItemAddLoop
这两个例子显示了为两个不同类型的自动化脚本提供的自定义代码名称。第一个用于搜索类脚本,第二个是一个数据创建脚本。简单来说,这样做只是为了符合 Java 的命名规则和建议。
在循环之前添加另一个自定义代码,模拟一个动态值,以便控制循环
- 右键单击循环元素,从上下文菜单中选择 Insert,这样做的目的是为了将自定义代码插入到循环元素之前。
添加该类是为了给循环提供一个随机值,将无限循环限制为一个预定义的值。在真实场景中,您可以使用任意值替换该值,以确定循环中断条件。您需要相应地修改循环控制自定义代码。
下面提供了本例中一些类的名称,以供参考:
customcode.returnRandomValue
customcode.controlMyLoop
- 请注意,上下文菜单中的 Add and Insert 选项的行为十分有趣。使用 Add 在引用元素之后 应用一个元素,而使用 Insert 则会引用元素之前应用一个元素。在这里,引用元素就是右键单击的元素,在本例中是 Loop 元素。
快速参考:
- Add 用于在引用元素之后应用元素
- Insert 用于在引用元素之前应用元素
您的测试应当类似图 7 所示。
图 7. 测试设计屏幕
清单 1. customcode.returnRandomValue(用于执行随机循环)
public String exec(ITestExecutionServices tes, String[] args) {
int rndNumber = (new Random().nextInt(10))+1;
tes.getTestLogManager().reportMessage("Random Number:"+rndNumber);
return ""+(rndNumber);}
|
在该代码中,要模拟一个动态值,您将使用一个随机值来生成 1 到 10 之间的一个整数。您可以将该值传递给循环内部的自定义代码(customcode.controlMyLoop)来控制循环迭代。
您可以在以下文件中找到完整的代码(参见 下载 部分):
returnRandomValue.java
注意:tes.getTestLogManager().reportMessage() 是一个 Rational Performance Tester 方法,我在前面的清单中使用它来输出随机数值。它将出现在两个位置上:
- 在测试日志中
- 在 Protocol Data > Event Log 下方
通常,在设计脚本时,我会使用大量此类语句来检查动态值。这有助于调试功能和代码问题。然而,在执行长期运行时,我会禁用这些语句。
清单 2. customcode.controlMyLoop
public String exec(ITestExecutionServices tes, String[] args) {
int i = tes.getLoopControl().getIterationCount();
if(i>Integer.parseInt(args[0]))
tes.getLoopControl().breakLoop();
else
tes.getTestLogManager().reportMessage("Iteration No:"+i);
return null;
}
|
您可以在以下文件中找到完整的代码(参见 下载
部分):
controlMyLoop.java
图 8 所示的屏幕截图显示了在 customcode.controlMyLoop 的 Test Element Details 下,如何使用自定义代码 returnRandomValue 的返回值作为参数(args[0])传递给自定义代码 controlMyLoop。
图 8. returnRandomValue 的随机输出
该代码测试最内层循环的迭代次数。最内层循环将在其迭代次数大于测试值(在本例中为 customcode.returnRandomValue) 的输出)时中断。
如果迭代次数小于测试值,那么代码将输出相应的迭代次数。
注意:
在处理 tes.getLoopControl() 对象时要注意,如果有多个循环,那么它将为最内层循环提供一个句柄。
例如,在 清单 3 的伪代码中,myloop 引用变量将具有到 LOOP2 的句柄。因此,该对象可用于获得迭代次数,或者用于中断或继续循环。
清单 3.
LOOP1
{LOOP2
{ ILoopControl myloop = tes.getLoopControl();
}
}
|
完成上述步骤后,开始运行该脚本。
执行者应当能够看到循环在完成特定次数的迭代之后将会自动中断。
图 9 显示,customcode.returnRandomValue 生成的随机数为 1(参见右侧的文本框)。虽然循环运行了两次,但是它满足 customcode.controlMyLoop (2>1) 中指定的条件检查,因此循环在第二次执行时被中断。
因此,我们实现了在特定条件下中断循环的目标。不过,可以将这里所示的条件检查替换为其他类似的条件检查。
例如,我们可以使用一个来自 HTTP 请求的引用值(而不是此处使用的自定义代码),并且根据自定义逻辑来中断循环。
图 9. 执行后的测试日志
循环的一个新增特性就是 continue 操作。在某些情况下,当您希望循环在满足某个条件后跳过执行时,那么这个特性很有用。例如,如果我希望只在偶数时执行循环体,那么可以使用这个特性。在清单 4 中,我修改了前面的代码以包含这个条件。
清单 4 显示了实现此目的的代码。
清单 4. 修改 customcode.controlMyLoop 代码以跳过非偶数迭代的循环体执行
public String exec(ITestExecutionServices tes, String[] args) {
int i = tes.getLoopControl().getIterationCount();
if(i>Integer.parseInt(args[0]))
tes.getLoopControl().breakLoop();
else
if(i%2 !=0)
tes.getLoopControl().continueLoop();
else
tes.getTestLogManager().reportMessage("Iteration No:"+i);
return null;
}
|
在对这些修改运行测试时,测试日志如图 10 所示。
图 10. 修改代码以继续执行循环后的测试日志
可以看到,customcode.returnRandomValue 中生成的随机数为 9。对于非偶数的迭代,会跳过循环执行,直到完成 10 次循环,这是循环的最终次数。
我希望本文能够帮助使用 Rational Performance Tester 的人实现测试自动化。阅读本文后,您应当能够创建一个自动循环,即使您刚刚开始接触 Rational Performance Tester。虽然可以通过其他方式实现相同的目标,但是本文演示的是我们已经在项目中成功实现的方法。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 测试最内层循环的迭代次数 | controlMyLoop.java | 359KB | HTTP |
| 生成 1 到 10 之间的一个整数 | returnRandomValue.java | 1KB | HTTP |
学习
- 在 Rational Performance Tester 产品概述页面 中了解更多。然后访问 IBM developerWorks 上的 Rational Performance Tester 产品专题,在 Rational Performance Tester Information Center 中找到其他技术文章的链接并浏览用户帮助。您还可以在信息中心中找到 向测试添加循环 的主题。
- 访问 developerWorks 上的 Rational 软件专区,获得有关 Rational Software Delivery Platform 产品的技术资源和最佳实践。
- 订阅 developerWorks 每周电子邮件通讯,选择要关注的话题。随时关注 developerWorks 技术活动和网络广播,主要针对各种 IBM 产品和 IT 行业话题。
- 参加 免费的 developerWorks Live! 技术讲座 快速了解 IBM 产品和工具,以及 IT 行业趋势。
- 查看 developerWorks 演示,那里提供了初学者的产品安装和配置演示,还提供了面向有经验开发人员的高级功能。
- 提高您的技能。查看 Rational 培训和认证 目录,其中包括有关广泛主题的多种课程。您可以随时随地进行学习,其中许多 “入门” 课程都是免费的。
获得产品和技术
- 下载 IBM Rational Performance Tester 试用版。
- 以最适合您的方式 评估 IBM 产品:下载产品试用版、在线试用产品、在云环境中使用产品,或在 SOA 沙盒 中学习如何高效地实现面向服务的架构。
讨论
- 加入 Performance Testing 论坛,您可以在此分享有关 IBM 性能测试产品的问题和知识。
- 给 Rational 软件评分或评论,以这种方式进行评分或评论既快又简便。
- 通过 撰写 developerWorks 文章,分享您的知识并帮助其他使用 Rational 软件的人。了解 如何撰写出优秀的 developerWorks 文章 以及如何写出好文章。
- 在 Facebook、Twitter (@ibmrational) 和 YouTube 上关注 Rational 软件,并添加您的评论和请求。
- 加入 Rational 论坛、cafés 和 维基,提出和回答问题,增加您的知识。
- 加入 Rational 社区,分享您的 Rational 软件知识并与您的同行取得联系。
