创建模块化性能测试来节省时间并改进重用性,第 1 部分: 使用 Rational Performance Tester 来在模块化测试之间交换数据

本系列文章关注于使用 IBM® Rational® Performance Tester 分割测试功能来创建模块化性能测试,并使用测试变量功能动态地交换数据。它解释了怎样完成以下的任务:从已存在的测试那里获得测试模块,同时保持原始的测试丝毫未改,使用 Rational Performance Tester Annotation 工具栏在记录期间实时地分割和注释测试,使用测试变量功能来将测试模块联系在一起,并使用各种测试模块来构筑用户场景并建模工作负荷。与本文相联系的指南(第 2 部分)会给出具体的指导,向您展示怎样使用测试变量来在测试之间共享数据。

Karline Vilme, 软件质量工程师, IBM

作者照片Karline IBM 软件部的一名软件质量工程师。她主要关注于 Rational Performance Tester 工具的系统验证、集成,以及性能测试。她于 2000 年加入 IBM,在 IBM 全球服务部担任过系统管理员和高级客户支持等多个职位。



2011 年 2 月 11 日

免费下载:IBM® Rational® Performance Tester 试用版  |   IBM® Rational® 测试人员资源工具包
获取免费的 Rational 软件工具包系列,下载更多的 Rational 软件试用版

使用模块化测试的优势

性能测试的一个核心活动,就是测试开发与定制。作为一个测试员,您可能会花费大量的时间,去开发和定制测试,这些测试通常需要重新记录,因为测试下的系统或者程序会发生变动。例如,您可能需要更改测试场景,以定位系统的不同部分,从而调查测试运行期间所发现的新性能问题。这可能会需要一系列新的测试,这样您就需要记录并定制,因此占用测试执行和结果分析的宝贵时间。

测试模块化的优势体现在以下几个方面:

  • 降低改动发生时重新记录测试的需要
  • 消除测试中的冗余步骤
  • 降低测试的规模
  • 改进测试的强壮性以及重用性
  • 使得调试变得更加容易,并更改测试场景的关注点。

使用模块测试涉及到了创建更小的测试模块。然后您可以使用测试模块作为构筑块,来构筑更大的或者更小的场景,这取决于测试的目标。本文解释了 IBM® Rational® Performance Tester 功能,例如 split test 以及 test variable,可以帮助您创建更加强壮和可再使用的模块测试。


术语

在您深入学习这些功能之前,您要了解一下 Rational Performance Tester 背景下接下来定义的意义:

测试模块
从大型测试分割的更小一点的测试,范围到在不同的场景下再使用它。Rational Performance Tester 并不会按照与规范性测试不同的方式处理该测试模块。
分割测试
从单个测试之中创建多个测试模块的能力。
测试变量
存储并引用测试中和测试之间信息的用户定义名字-值对。

创建模块化测试记录

随着 Rational Performance Tester 8.1 版本的发表,您就可以使用分割测试功能,来将一个大型的测试分割为小型的测试模块,同时原始的测试丝毫未变。通过使用 Annotation 工具栏(8.1.1 版本中所发布),您还可以在记录过程中识别测试模块界限。然后您可以使用测试变量功能,以将各种测试模块联系到一起。

测试变量

  • 不要加入带有分割测试选项的测试变量。
  • 总是选择与登录交易相联系的服务器。
  • 对于一次 HTTP 测试来说,服务器连接会自动作为测试变量添加,并保持分割测试不变。

在接下来的三部分中,您将会学到怎样完成以下的任务:

  • 记录之后分割一个 SAP 测试
  • 记录之后和记录期间(实时)分割一个 HTTP 测试
  • 记录期间注释一个 HTTP 测试

尽管本文关注于 SAP GUI 和 HTTP 扩展,所有其他的 Rational Performance Tester 扩展还会支持分割测试和测试变量功能。

分割一个 SAP 测试

分割测试

  • 列出的步骤针对的是 Rational Performance Tester 8.1.1 版本,但是它们对于 8.1 版本及其后续版本也是类似的,除了对于最后一步您选择分割测试以外。
  • SAP 测试只能在交易层次上分割。这是需要的,因为会在界面的背景下获取 SAP 请求与响应。如果界面失序的话,那么测试在回馈期间将会失灵。
  • 不要加入带有选项的测试变量容器,以作为一个新的分割测试保存。
  • 对于一个 SAP 测试,可以选择带有登录交易的服务器连接。
  • 对于一个 HTTP 测试,服务器连接会作为测试变量容器下面的一个子容器加入。它会一直使用分割测试。

在记录之后,您可以在测试编辑器中选择一个或者多个交易,并将选项保存为一个新的测试。当您在选择多个交易时,它们必须是持续性的。否则,将选择保存为一个新测试的选项将会禁止。这一点非常重要,因为交易之间可能有一些附件。

分割一个测试的步骤非常简单和快捷:

  1. 在测试编辑器中打开测试。
  2. 选择一个测试交易(参见图 1)。
  3. 右击并将选项保存为一个新的测试,这将会打开分割测试对话框,这样您就可以重命名,并向测试添加注释了。
图 1. 为分割测试选择交易
单个选项和多个选项的屏幕截图

图 2 显示了一个范例,其中有三个不同的测试模块来自于单个 SAP 测试记录的测试。测试模块包含了 Login,Create order 以及 Logout 测试。

图 2. 来自单个 SAP 记录的多个测试模块
单个测试分割为三个测试模块

分割测试变量

  • 测试变量容器会一直使用每一个分割测试模块。它包含了来自原始测试的测试变量。您可以根据自己的需要来添加或者删除变量。
  • HTTP 分割测试包含了 Rational Performance Tester 生成的测试变量,它会在分割过程中得到自动创建。它们存储在“Variables Created by Split Test”容器之中。
  • Rational Performance Tester 会自动决定哪些变量在分割测试中不会改变,并创建联系,这样您就不用编写通用代码了。您可以根据自己的需要添加或者删除变量。

分割一个 HTTP 测试

分割 HTTP 测试脚本的步骤类似于前面在 SAP 中所描述的步骤,只存在一点的差异:

  • HTTP 测试可以使用 Rational Performance Tester Annotation 工具栏来得到分割,以插入分割点。
  • HTTP 测试可以在页面层次上进行分割(参见图 3)。但是,如果测试包含有交易的话,那么可以在交易层次上将它们分割。
图 3. 为 HTTP 分割测试选择页面
选择的“Save Selection As New Test”

图 4 显示了来自单个 HTTP 测试记录测试的多个分割测试模块。模块包含有 Login,Import,Create 以及 Logout 测试。

图 4. 来自单个 HTTP 记录的多个测试模块
单个 HTTP 测试分割为四个测试模块

图 4 中的所有测试模块包含了 Rational Performance Tester 所生成的测试变量。这些测试变量会自动生成和设置,同时分割测试以在测试模块之间创建联系。另外,有一些测试模块包含了 Rational Performance Tester 设置的变量,以及后续测试模块所使用的变量。

记录期间分割一个 HTTP 测试

使用 Rational Performance Tester Annotation 工具栏,您可以在记录期间实时分割 HTTP 测试。在记录测试期间,您可以使用 Annotation 工具栏来向测试插入分割点。在记录完成之后,Rational Performance Tester 会在插入的分割点和提供的测试名基础之上,自动生成私人的测试模块。

注释与名字

  • 必须安装 Rational Performance Tester Annotation 工具栏(在浏览器中),以在记录期间创建 HTTP 分割测试。
  • 您要在安装 Rational Performance Tester 之后,在首个(HTTP)记录之上的浏览器上安装 Annotation 工具栏。
  • 使用注释来在记录期间注释测试。这使得记录之后理解和分割一个测试变得更加容易。
  • 从包含有分割点的记录中重新生成单个的完整测试,是可能的。
  • 当您在命名分割测试时,所起的名字是针对前面部分中所生成的测试,而不是后面部分中所生成的测试。

如果,在完成记录操作之后,您要意识到不适当的分割测试,或者出于其他的原因考虑,您想要完成记录,那么您可以从原始记录中使用 recmodel 文件,该记录包含了分割点,以重新生成一个完整的测试,而不用进行分割。

Annotation 工具栏还提供了其他的一些功能,您可以使用这些功能来在记录期间注释您的测试。它使得您可以实时地向测试插入注释和交易。另外,您可以使用它,来重命名页面,同时给它们起一个有意义的名字。这些任务可以在记录测试完成之后执行,然而通常一边记录一边执行会更加方便和有效。

当在记录期间为分割测试提供一个名字时,记住该名字将会与为记录部分前一章节所生成的测试联系到一起,而不是接下来的章节,这一点会非常重要。

图 4 显示了使用 Annotation 工具栏注释记录的一个范例。例如,前两个页面被重命名为更有意义的名字,例如 Login 与 Home。注释使得理解测试目的,以及记录过程完成之后您可能在什么地方分割测试,变得更加容易。

图 5. Recorder Test Annotation 工具栏
显示工具栏图表意义的标签

提示

  • 当您在不同的 HTTP 测试记录之间合并测试单元时,您要一直评审 Rational Performance Tester 生成的分割测试变量。请确保来自后续测试模块的变量得到了创建,并分配测试模块所执行的值。
  • 记录测试模块之间的附件,这一点非常关键。这有助于改善维护性和重用性。
  • 您可以使用注释,或者与每一个测试相联系的测试属性描述字段,来记录附件,以及关于测试和日程安排的其他信息。

既然您已经学到了使用 Rational Performance Tester 分割测试功能,来创建模块测试脚本,在接下来的章节中,您将会学到怎样为以下目的使用它们:

  • 使用各种测试模块来构筑测试场景
  • 使用 Test Variable 功能来联系各种测试模块,这样它们彼此之间就可以交换数据了

构筑来自测试模块的测试场景

正如在 图 2图 4 中所描述的那样,您可以在记录之后,以及记录期间从测试中创建测试模块。每一个分割测试都代表了一个可相互更改的测试模块,您可以将其重新组织或者合并到更大或更小的场景之中。图 6 显示了一些测试模块(A 到 D),它们用于创建不同的测试场景。它还显示了一些模块,例如 A 到 D,它们在一些场景合并中会得到重新使用。

图 6. Creating test scenarios by using test modules
使用测试模块来构建测试场景

最佳实践方式

当您在记录和分割测试脚本时,考虑一下以下的最佳实践方式:

  • 当您记录测试时,在每次场景的末尾或者注销之前,返回至主界面或者页面。拥有公共的开始和结尾界面或页面,会为其他测试提供一个可知的状态作为可靠的进入点。当您添加很多的模块时,这有助于长期的维护性。
  • 一直记录附件以及关于分割测试模块的其他信息。这将有助于改进测试脚本的维护性和重用性。您可以通过向测试添加注释,或者使用与每一个测试相联系的属性描述字段,来改进测试脚本的维护性和重用性。在每一次测试模块之前插入注释会非常有用,因为这些注释是可见的。

使用测试变量在测试之间动态地交换数据

“测试变量”功能在分割测试过程中扮演着重要的角色。在您将一个测试记录分割为小型的测试模块之后,您需要一个在这些模块之间共享数据的机理。Rational Performance Tester 测试变量提供了这个功能。您可以在一个测试中定义一个变量,以获取和存储测试数据,然后在第二个测试中引用测试变量。如果您将测试变量的可视性(范围)设置为“All tests for this user”而不是“This test only”,那么 Rational Performance Tester 会在测试的末期一直使用测试变量的值。既然测试变量会定义为“All tests for this user”的测试变量,那么未来测试中会引用的相同测试变量会共享与虚拟用户相同的值。

测试变量使用

从编程的角度来看,在 Rational Performance Tester 中使用测试变量,类似于在其他编程语言中使用它们。您可以声明并初始化一个测试变量,设置它的范围,并更改它的值。在 Rational Performance Tester 测试中与其他编程中使用变量的不同之处在于,您可以使用图形化的用户界面以及编码软件,来执行所有的任务。同样,只有在 Rational Performance Tester 中,您才能够处理运行时中的错误,并在测试模块之间共享变量。

图 7. 测试变量使用流程图
流程图

图 7 的大图

变量声明

在您识别想要联系在一起的测试模块之后,接下来的一步是声明变量,并分配它们。

声明变量的步骤是快捷且简单的:

  1. 右击 Test Variables 容器。
  2. 点击 Add
  3. 点击 Variable Declaration 并输入一个变量名。
图 8. 变量声明
显示选项的下拉菜单

测试之中的 Test Variables 容器是从不能删除的记录中生成的,但是它可以得到重命名。在您为测试定义更多的测试变量时,您可以添加子容器以帮助您组织它们。对于您所定义的测试变量和容器,使用有意义的名字会是一个不错的主意。

一个变量会使用一个空白的字符串作为声明时的默认值,来得到初始化。您可以使用您自己的字符串,或者来自另一个数据源的值来替换该值,这些数据源包括数据汇,引用,通用代码,或者其他的测试变量。您还可以选择,使用变量分配操作器来更改或者不初始化测试变量。您可以查看 图 11 以得到一个范例。通过通用代码来访问和更改测试变量,也是可能的。

另外,当一个变量尚未初始化时,您可以选择处理运行时错误。您可以选择什么都不做,处理一个测试日志错误或者警告,或者只是退出测试。尽管运行时错误处理只是可选的,但是在测试之间共享数据时,处理运行时错误就变得十分重要了。错误可以发生在首个测试期间,并阻止您去设置变量的值,并导致其他的测试接受一个空值。您可以查看 图 9 以得到一个范例。

变量范围

执行期间测试变量存储在数据区域之中。它的范围决定了对于其他的测试而言,它是否可见。

图 7图 9 显示了设置变量范围的两个选项。您可以将变量的范围设置为对“This test only”或者“All tests for this user”可见。这个概念类似于其他编程语言中的本地或者全局/类变量。

图 9. 设置变量的范围
与测试变量相联系的字段

使用测试变量

  • 测试变量可以在测试期间得到引用,而值在测试中不会改变。
  • 本地测试变量在运行时不会存储在用户数据区域之中。它必须作为一个论断传递给通用代码,而变量可以设置为通用代码返回值。图 11 显示了设置为通用代码的测试变量,它将会返回一个值。

本地变量使用

本地变量就是一个范围设置为“This test only”可见的变量。这意味着您只能在声明它的测试中引用该变量,而不是在其他测试之间引用它。这是因为一个测试所设置的数据对其他测试来说是不可见的,就算其他的测试也包含有相同名字的变量也是这样。测试变量只能通过通用代码来访问。

图 10 显示了本地变量使用的范例,这里测试变量会使用来自数据汇(登录权限)的值来得到初始化。然后测试变量会替换为测试的记录值(用户名与密码)。通过更改这些变量的值,您可以在使用相同登录信息的其他测试中引用它们。

图 10. 使用数据汇值得到初始化的测试变量
分配来自数据汇的测试变量值

前用户变量使用

前用户变量的范围被设置为在“All tests for this user”中可见,这使得它对相同虚拟用户所执行的所有测试可见。通过声明带有相同名字的变量,并将其范围设置为“All tests for this user”,您可以从其他的测试中引用一个前用户变量。来自首个测试的变量的范围,也必须设置为“All tests for this user”,以让它对第二个测试可见。

共享的变量

  • 为了在测试之间共享变量,测试必须包含带有相同名字的变量,而且变量的范围必须设置为对“All tests for this user”可见。
  • 测试变量不是在用户之间共享,但是可以在相同虚拟用户的不同测试间共享
  • 前用户测试变量存储在用户数据区域之中。您还可以使用通用代码来访问并更改它们的值。
  • 为您的测试变量初始化并处理运行时错误。

处理测试变量的运行时错误会非常重要,特别是在与其他测试共享它们时更是这样。在首轮测试的执行期间,可能会产生一些错误,使得您不能去设置变量值。如果变量尚未初始化的话,您需要决定接下来的一步要做什么。Rational Performance Tester 提供了一些选项,您可以从中作出选择(见于 图 7):

  • 什么都不做
  • 处理测试日志警告/错误
  • 退出测试

图 11 和图 12 显示了前用户使用的范例,其中来自一个测试的数据汇使用测试变量传递给其他的测试。

在图 11 中,orderNumber 测试变量会得到声明,并使用一个“no-value”字符串初始化。随后,它的值会设置为一个顺序号,它是由使用变量分配操作的通用代码所返回的。

图 11. 测试中使用测试变量的范例
显示测试变量使用的测试脚本

图 12 显示了第二个测试模块(VA02),它使用与 VA01 测试模块相同的名字。VA02 测试模块删除了 VA01 测试模块创建的顺序。在这个范例中,VA02 测试模块会引用来自 VA01 测试的数据,而不是,例如,来自用户生成数据汇的数据。

图 12. 引用来自另一个测试的测试变量
另一个测试中设置的测试引用变量

既然您已经学到了怎样创建模块化的测试用例,并使用测试变量将它们联系在一起,那么接下来的部分,将会向您展示使用测试模块来建模日程安排的范例。


建模工作负荷

当您完成开发和定制测试模块时,您就可以组织和合并各种测试模块,以评价工作负荷场景。

图 13 显示了用于建模工作负荷场景的各种测试模块的范例。在这个范例中,Login,Create order,Logout test 模块使用分割测试功能,来自于单个测试(VA01)。然后这些模块会得到组织,并与来自另一个测试的 Delete order 测试模块(VA02)合并到一起。

日程安排结构

当您构筑日程安排时,维护测试的通用结构,这一点是非常关键的。

例如,SAP 测试结构包含了一个登录,其他任务,以及一个注销模块。这些结构必须得到维护,以确保测试得到适当的回馈

正如在 图 11图 12 中所示的那样,Create order 以及 Delete order 测试模块必须通过名为 orderNumber 的测试变量联系到一起。

图 13. 带有各种 SAP 测试模块的日程安排模型
使用 SAP 测试模块的日程安排范例

稍后在登录和注销间将会插入其他的测试模块,该工作负荷场景会得到扩展,以包含其他的功能。与之类似,通过删除或者禁止特定场景所不需要的测试模块,可以使模块变得小一点。

当您使用 HTTP 测试记录建模工作负荷时,您要一直评审 Rational Performance Tester 所生成的分割测试变量,以确保来自后续测试模块的变量会得到创建,并分配测试模块所执行的值。

最佳实践方式

  • 当您在使用测试模块建模工作负荷场景时,要一直维护测试的通用结构。它应该包含有一个开始和一个结尾。例如,SAP 场景应该包含有一个登录测试及一个注销测试。
  • 当您使用各种测试模块来构筑工作负荷场景时,您要确保它们组织在一个有效,且程序稳定使用的流程之中。
  • 意识到模块之间的附件。如果测试模块得到重新排序,那么您要确保使用的共享测试变量会得到初始化,以及适当的设置。这就是为什么需要记录测试模块的附件的原因之一。
  • 在执行之前一直检查测试脚本,以确保您创建并分配所有预期的变量。

使用分割测试和测试变量的好处

使用分割测试和测试变量功能,会有以下的好处:

  • 从单个记录那里获得测试模块,同时原始的测试丝毫未变。
  • 您有三种方法从测试中消除冗余性的步骤:
    • 降低测试的规模以及维护时间
    • 改进测试的重用性和强壮性
    • 使得测试更容易调试
  • 通过重新组织和合并测试模块来构建更大的用户场景
  • 使得快速更改用户场景变得更加容易,当问题产生时,定位系统的不同部分。

总结与指南

本文关注于使用“分割测试”功能,并使用“测试变量”功能来在测试模块之间交换数据,来创建模块化的性能测试。

通过使用分割测试功能,您可以从已存在的记录那里获得测试模块,同时丝毫不改变原始的脚本。另外,您还可以分割并注释一个测试,同时使用 Annotation 工具栏来进行记录。

测试变量功能会促进测试模块之间数据的交换。测试变量用于在测试之间以及测试之中引用数据。测试变量还用于在没有模块化的规范测试之间交换数据。

测试模块可以交互性地使用,以构筑更大或者更小的用户场景,这取决于测试的目的是什么。

测试模块化提供了以下的几个好处:

  • 有助于降低每次改动发生时重新记录测试的需要
  • 从测试中消除了冗余性的步骤
  • 降低测试的规模,改进测试的强壮性和重用性
  • 使得调试重新变得更加容易,并更改测试场景的关注点

现在您可以继续学习 第 2 部分:指南,它是使用 Rational Performance Tester 测试变量的真实范例。您可以一步步地学习它以获得实际的经验。


致谢

感谢以下人员对本文所做的评审和注释工作:Kent Siefkes,Sanjay Joshi,Alex Bernstein,Joel Duquene 以及 Jean-Philippe Delpiroux。另外,感谢 Arif Muhammed 提供了指南范例 图 1011 中所描述的 HTTP 屏幕截图。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=626473
ArticleTitle=创建模块化性能测试来节省时间并改进重用性,第 1 部分: 使用 Rational Performance Tester 来在模块化测试之间交换数据
publish-date=02112011