UML软件工程组织

 

 

负载分析-性能测试成功的基础

2008-05-30 作者:姚雪松 来源:IBM

 
本文内容包括:
软件质量要从不同的维度来进行评估,其中包括可靠性、功能和性能。负载分析是为了识别并定义不同的变量,这些变量会影响应用程序或系统的性能,并会影响到评估性能所需的评测。我们在进行性能测试之前应该针对被测试系统的具体要求建立负载模型,以正确描述被测试系统的负载情况。负载模型的建立是通过负载分析实现的。接下来我们将对负载分析的概念和需要掌握的要点进行介绍。

1负载分析概述

软件质量要从不同的维度来进行评估,其中包括可靠性、功能和性能。负载分析是为了识别并定义不同的变量,这些变量会影响应用程序或系统的性能,并会影响到评估性能所需的评测。我们在进行性能测试之前应该针对被测试系统的具体要求建立负载模型,以正确描述被测试系统的负载情况。负载模型的建立是通过负载分析实现的。接下来我们将对负载分析的概念和需要掌握的要点进行介绍。

负载分析侧重于以下主要变量的特征和属性:

  • 要在性能测试过程中执行和评估的用例
  • 要在性能测试过程中模拟/仿真的主角
  • 负载 - 同时参与的主角的数量和类型、被执行的用例的数量和类型以及时间或吞吐量百分比。

1.1用例和用例属性

可以为性能测试确定并使用两种类型的用例:

  • 关键用例 - 在性能测试中所评测和评估的用例
  • 重要用例 - 可能对关键用例的性能行为产生影响的非关键用例

关键用例

并非在测试对象中实施的所有用例都是性能测试的对象。关键用例是那些将成为性能测试重点的用例,这意味着它们的性能行为将得到评测和评估。

要确定关键用例,可确定用例是否符合一条或多条以下标准:

  • 用例需要评测和评估性能
  • 用例被一个或多个主角频繁执行
  • 用例表现出较高的系统使用率百分比
  • 用例需要使用重要的系统资源

列出关键用例,以将其包括在性能测试中。

在确定并列出关键用例的同时,应检查事件的用例流。特别是,应开始确定当执行用例时在主角(类型)和系统之间的特定事件序列。

另外,还需确定(或核实)以下信息:

  • 用例的前提条件,如数据的状态(什么样的数据应/不应存在)和测试对象的状态
  • 可能是常量(相同量)的数据,或从一个用例实例到下一个用例实例必须不同的数据
  • 该用例与其他用例之间的关系,例如在执行该用例时必须遵循的顺序
  • 用例的执行频率,例如同时执行的用例实例的数量,或用例占系统总负载的百分比

重要用例

与关键用例不同,关键用例是性能测试的重点,而重要用例是那些可能影响关键用例性能行为的用例。重要用例包括符合一条或多条以下标准的用例:

  • 用例必须在执行关键用例之前或之后执行
  • 用例被一个或多个主角频繁执行
  • 用例表现出较高的系统使用率百分比
  • 用例需要使用重要的系统资源
  • 用例在执行关键用例的同时在部署系统上定期执行,如电子邮件或后台打印。

1.2主角和主角属性

成功的性能测试不仅需要确定执行关键用例和重要用例的主角,还必须模拟/仿真主角行为。也就是说,一个主角实例在执行与另一个主角实例相同的用例和事件用例流的同时,可以与测试对象进行不同的交互(响应提示、输入不同数据值等活动需要更长的时间)。可考虑以下的简单用例:

图1 一台 ATM 机器的主角和用例
图1 一台 ATM 机器的主角和用例

主角"顾客"在用例执行的第一个实例中是一位有经验的 ATM 用户,但在另一个主角实例中却是一位没有经验的 ATM 用户。有经验的 ATM 主角迅速浏览 ATM 用户界面,他几乎不会花时间来阅读每条提示,而是按照记忆按动按钮。但没有经验的 ATM 主角则要阅读每条提示,并且在作出响应之前要用较多的时间来理解信息。符合实际的性能测试反映了这种差异,从而可确保准确地评估在部署测试对象时的性能行为。

首先确定以上列出的各个用例的主角。然后确定可能执行各个用例的不同主角原型。在上面的 ATM 示例中,可能有以下主角原型:

  • 有经验的 ATM 用户
  • 没有经验的 ATM 用户
  • ATM 用户的帐户位于该 ATM 的银行网络"之内"(用户的开户银行为拥有该 ATM 的银行)
  • ATM 用户的帐户位于该 ATM 的银行网络之外(其他竞争银行)

对于每个主角原型,需确定主角属性的不同值,例如:

  • 思考时间 -主角响应测试对象的各项提示所用的时间
  • 按键速度 -主角与接口交互的速度
  • 请求速度 - 主角向测试对象提出请求的速度
  • 重复次数 - 按顺序重复用例或请求的次数
  • 交互方法-主角所使用的交互方法,例如使用键盘输入值、切换到某个子段、使用快捷键等,或使用鼠标"指向并单击"、"剪切并粘贴"等。

此外,对于每个主角原型,应确定它们的工作文档,并指定它们要执行的所有用例和流程,以及执行用例的主角所用时间的百分比或工作量的比例。这些信息可用于确定和创建符合实际的负载。

1.3负载和负载属性

前面已经提到过,负载是影响测试对象的性能行为的因素之一。负载的定义为:

  • "模拟的最终用户与测试对象进行交互的实例,以及影响系统使用和性能的变量"

准确地确定将被用来执行和评估性能行为的负载是很关键的。一般情况下,性能测试要在不同的负载下执行多次,每种负载都是下列属性的一种变形:

  • 与测试对象同时进行交互的主角数量
  • 与测试对象进行交互的主角类型(以及每个主角所执行的用例类型)
  • 各个关键用例的执行频率,及其按顺序执行的频率(重复频率)

对于用于评估测试对象性能的每种负载,应确定以上各变量的值。各个变量在不同的负载中所使用的值可以从业务用例模型中获得,或通过观察和访问主角获得。至少应获得三种负载:

  • 最佳 - 反映最佳可能部署条件的负载,例如,只有一个或少数几个主角与系统进行交互、只执行关键用例,这种负载在测试过程中很少执行或根本不执行额外的软件或用例。
  • 额定 - 反映当前部署条件的负载。
  • 峰值 - 反映最差部署条件的负载,例如,最大数量的主角、执行最大数量的关键用例,这种负载要同时执行许多或所有额外的软件和用例。

如果性能测试包括强度测试时,应确定几种额外的负载,每种负载都针对于一个系统或负载变量,并将其设置到部署系统的正常预期容量之上。

上面讲述的是负载分析的概念和原理,接下来将介绍如何将这些概念和原理应用到 IBM Rational Performance Tester 上。

无论你使用什么样的性能测试工具,你首先要确定哪些你需要执行的关键和重要测试用例。当你确定了这些用例后,你就知道了测试的主角、主角的行为、主角的数量与分组情况,以及主角行为中的细节(比如,在每一个动作之间的思考时间、动作的频率等等)。有了这些信息我们便可以开始使用 IBM Rational Performance Tester 来创建能够模拟你所期望负载的测试了。

在 IBM Rational Performance Tester 中你可以通过创建一个调度,并将用户组、测试以及其它元素加入调度,来表现工作负荷量。

性能测试:在前面的章节中已经介绍过了性能测试创建。一个单独性能测试代表了一个用户(主角的实例)与系统进行交互的行为。在这里,性能测试代表了测试用例。你可以根据已经制定好的关键和重要测试用例来创建性能测试。

用户组:在IBM Rational Performance Tester 中,用户组是代表了同一角色的一群人。用户组用来表示主角,你可以根据不同的主角创建不同用户组来,并通过设置用户组的配置项来指定主角的属性(例如,思考时间、重复次数等)。一个主角可以与多个测试用例相关联,比如,一个网上购物的顾客主角,可以与测试用例查许物品和购买下单关联起来。在IBM Rational Performance Tester 中的用户组中也可以包含多个与用户组关联的测试。如图1。

图2
图2

调度:是一个用来管理性能测试的测试元素,一个调度可以包含一系列用户组,通过对用户组的规划来产生对被测试系统的负载。在调度中结合用户组你可以设置各种负载的属性,比如主角的数量和用例的执行频率等。IBM Rational Performance Tester 中,你可以手动的运行调度,也可以通过定时的方式运行调度。

在大概了解了如何将负载分析的概念映射到 IBM Rational Performance Tester 中的测试元素后,接下来的章节将详细的介绍 IBM Rational Performance Tester 的调度、用户组以及其他相关的测试元素的具体使用方法。

2调度介绍

在 IBM Rational PerformanceTester中,一个调度即可以简单的模拟一个虚拟用户运行一个测试,或者模拟复杂的如分布在不同组的几百个虚拟用户,每个用户在不同的时间运行不同的测试。

一个调度是运行一个测试的"引擎"。然而,调度的作用远超过运行测试的简单目的。有了一个调度,你可以:

  • 将测试分组到不同的用户组下,以模拟不同类型用户的动作。
  • 设置测试运行顺序:顺序,随机,或者按照加权顺序。
  • 设置每个测试运行时间的数量。
  • 按照一定的比例运行测试。
  • 在远程位置运行用户组。

你创建完一个描述你的系统行为的调度之后,你就可以运行此调度了,你可以使用还未经完全测试的应用程序的成功构建版本,或者使用一个不断增长的虚拟用户的数量。然后你来分析所报告的结果。

3用户组

在 IBM Rational PerformanceTester中,用户组使你能够按照一个逻辑顺序来分组测试。

用户组使你能够:

  • 按照特性来分组测试。例如,你可以分成两个用户组――一个客户组和一个工作人员组――来表示你系统上的用户类型。
  • 影响测试运行的顺序。当你运行一个调度时,每个用户组中的第一个测试并行而不是串行地运行。在一个用户组完成第一个测试后,运行第二个测试,然后是第三个,等等。

下面的调度包含一个用户组。

图3
图3

如果你用10个用户运行此调度,他们只能被分配到用户组中。当调度运行开始时,10个虚拟用户就开始并行地执行第一个测试。只要一个测试完成了,他就会移动到第二个测试。这样你有了十个虚拟用户,所有用户都在同一时间开始,并继续执行每个测试。这不会给你更多运行之上的控制。

下面的调度包含了按照相同顺序的相同测试,但是它们分到两个用户组之中了。从概念上看,这个调度是容易理解的,因为用户的任务被逻辑上分组了――Browser浏览和Buyer浏览,然后投标一个产品。但是,更加重要的是,这个调度是你的系统上的用户类型的一种更为准确的表示法,因为每个用户组包含了表示他们所作动作的测试,并且用户组的比例(70% 和 30%)代表了你的系统上的用户的比例。

图4
图4

如果你用10个用户运行此调度,七个被分配给Browsers组,并且三个被分配给Buyers组。当运行开始时,七个Browsers和三个Buyers并行地开始。这样你就有了七个Browsers ,每个Browser顺序地执行两个测试(open 和 Browse),以及三个Buyers,每个顺序地执行三个测试(open 、 Browse和 Bid)。

4 在 IBM Rational Performance Tester中使用调度

这部分将讲述在 IBM Rational Performance Tester 中如何通过使用调度来实现对用户工作负载的模拟。IBM Rational Performance Tester 中使用调度的主要步骤如下:

1. 创建一个调度

2. 增加元素到一个调度中

3. 设置启动运行的用户数量

4. 在不同的时间启动用户

5. 设置思考时间行为

6. 设置运行持续时间

接下来,我们将详细的讲述每一个步骤的操作方法。

4.1创建一个调度

调度可以让你精确地模拟单个用户的动作。

要创建一个调度:

1. 右键点击你的项目,然后点击新建 > 性能调度。

图5
图5

2. 在性能调度向导中,输入调度的名字,然后点击完成。

图6
图6

3. 出现带有一个用户组的一个新调度。你可以向调度中增加用户组、测试以及其它元素,来模拟工作负荷量。

图7
图7

4.2 增加元素到一个调度中

一个调度只需要一个用户组和一个测试运行。然而,要准确地代表一个工作负荷量,你应当增加其它元素。

4.2.1增加一个用户组到一个调度中

一个用户组让你将测试分组在一起,并且并行地运行测试。

要增加一个用户组:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 在调度编辑器中,右键点击调度,然后点击添加 > 用户组。

图8
图8

4. 调度元素详细信息区域的组名字段中,为用户组输入一个描述性的名字。

图9
图9

5. 在组大小域中,选择绝对或者百分比,并且在组中输入用户数量和用户百分比。


6. 决定用户组将运行在你的计算机上还是在另一个计算机上。

图10
图10


7. 要声明一个远程位置:

a. 点击添加新的。

图11
图11

b. 在添加位置向导中,选择存储此位置的项目。

图12
图12

c. 在文件名字段中,输入将包含该计算机信息的文件的名字,然后点击下一步。

注意:存储在此文件中的数据包括诸如主机名和部署目录的信息。你可以稍后通过打开测试导航器,并双击此文件,来更改此信息。

d. 在名称字段中,为远程计算机输入一个描述性的名字。

e. 在主机名字段中,输入远程计算机的IP地址或完全资质的主机名。

f. 在部署目录字段中,输入将存储测试资产的远程计算机的目录。此目录如果不存在会被创建,用来存储在一个调度运行期间所需要的临时文件。

g. 在操作系统字段中,选择远程计算机的操作系统,然后点击完成。

图13
图13

8. 要增加一个已声明的位置:

a. 点击添加现有的。

b. 在选择位置对话框中,选择用户组将在其上运行的计算机,然后点击确定。

下面的调度显示了两个用户组。Browsers代表了70%的用户,Buyers代表了余下的30%:

图14
图14

在你增加完用户组之后,你通常会增加每个用户组将运行的测试。

4.2.2增加一个测试到一个调度中

一个测试让你模拟一个单个用户的动作。

要增加一个测试到一个调度:

1. 在测试导航器中,展开项目直到你定位了调度。

2. 右键点击调度,然后点击打开。

3. 右键点击将包含此测试的用户组,然后点击添加 > 测试。

图15
图15

4. 在选择性能测试对话框中,展开项目名以显示你想增加的测试。

图16
图16

5. 点击测试的名字,然后点击确定。测试出现在调度中。

图17
图17

4.2.3增加一个循环到一个调度中

一个只包含用户组和测试的调度将会在一个用户组中顺序地运行每一个测试。循环提供了比运行一个连续测试的简单序列更高级的控制。增加一个循环可以让你多次反复地重复一个测试,并设置一个测试运行的速度。

要增加一个循环:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 点击将是循环父节点的条目,然后点击添加 > 循环。

图18
图18

4. 在调度元素详细信息区域中,输入循环将重复的迭代次数。

图19
图19

5. 要为所有是此循环的子节点的调度元素维护一套处理速率。

a. 选择控制迭代速率。

图20
图20

b. 在迭代率中,输入一个数字并选择一个时间单元,这会设置实际的速度。

c. 选择或清空

随机改变迭代之间的延迟。选择这个框会引起非常轻微的延迟,更加准确地建模你的用户,因为他们会在一段时间被随机地展开。

d. 选择或清除在循环的第一次迭代之前延迟。选择这个框会错开每个迭代中的第一次延迟,这样你在第一次迭代时就可以得到一个逼真的调配。

下面的调度包含两个循环。注意,由循环所控制的Browse和Bid测试,必须是循环的子节点。

图21
图21

4.2.4增加一个延迟到一个调度中

一个延迟让你更进一步地控制用户动作。例如,你可能想减缓多个用户的初始启动。

要增加一个延迟到一个调度中:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 右键点击将包含延迟的调度元素,然后点击添加 > 延迟。

图22
图22

4. 在调度元素详细信息区域中,输入延迟的长度和时间单元。

图23
图23

在你增加一个延迟之后,你通常要增加延迟控制的调度元素。注意,这些元素和延迟处于相同的级别――它们不是延迟的子节点。

下面的调度显示了三个延迟。Browsers在每个浏览动作之间延迟10秒。Buyers在每个浏览动作之间延迟30秒,在他们决定投标一个商品项之前延迟一分钟。

图24
图24

4.2.5增加一个随机选择器到一个调度中

一个只包含用户组和测试的调度将会在一个用户组中顺序地运行每一个测试。增加一个随机选择器可以让你按照随机顺序重复一系列测试,从而模拟实际用户的不同动作。

要增加一个随机选择器:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 点击包含随机选择器的调度元素的名字,然后点击添加 >随机选择器。

图25
图25

4. 在调度元素详细信息区域中,增加迭代数量到循环中。

图26
图26

我们来描述一下"随机选择器"的工作原理。假设你的眼睛被蒙起来,并且在你面前有一个桶,里面含有10个红球和10个绿球。你有50%的机会抓到一个红球,有50%的机会抓到一个绿球。你随机地抓一个球――球是红的。然后你在桶里换一个球。每次你抓一个球,你都有50%的机会得到一个红球。因为在每次选择之后球都会被替换掉,桶里总是有10个红球和10个绿球,甚至有可能(但是未必)你每次都会抓起一个红球。

5. 设置一个权重以控制此选择的随意度。

a. 右键点击随机选择器,并选择添加 > 加权块。

图27
图27

b. 在权重字段中,输入一个整数。这个整数表示每个测试运行的相关比例。

图28
图28

假定一个随机选择器包含两个测试:Browse和Bid。你分配Browse一个权数7,分配Bid一个权数3。每次执行循环,Browse有70%的机会,Bid有30%的机会被选择。

图29
图29

4.3 设置启动运行的用户数量

设置在一个运行中的初始用户数量。一旦运行启动,你可以增加这个数量。

要设置在运行中启动的用户数量:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 在调度内容区域中,点击调度的名字。

4. 在用户负载区域中,设置用户数量为你想启动的用户数量。

图30
图30

当一个调度运行时,用户被按照以下来分配:

1. 首先分派绝对的组。按照用户组在调度中出现的顺序将用户分派到每个绝对的用户组。

2. 百分比的组依照被分配的值进行分派。如果一个组在多个远程计算机上运行,用户会被同等地划分到远程位置中。

例如,假定一个调度包含下面的用户组,所有的用户组都运行在相同的计算机上:

图31
图31
  • 如果你为用户数量输入2,他们都被分配到Absolute_5用户组。
  • 如果你为用户数量输入5,他们都被分配到Absolute_5用户组。
  • 如果你为用户数量输入11,5个用户被分配到Absolute_5用户组,1个用户被分配到Absolute_1用户组,3个用户被分配到Browsers用户组,以及2个用户被分配到Buyers用户组。如果Browsers和Buyers的位置在调度中被颠倒过来,Buyers将会有3个用户。

4.4 在不同的时间启动用户

要避免系统过载(并引起连接超时),你可以错开启动的用户数量,不要立刻全部启动它们。要错开虚拟用户的启动时间:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 在调度元素详细信息区域中,在用户负载区域下,选中在启动每个用户之间添加延迟。

4. 在延迟中,输入一个数字,并选择一个时间单元。

图32
图32

4.5设置思考时间行为

让你增加、减少或随机设置思考时间(软件中使用的是报文延迟时间)――或准确地按照记录的进行回放。思考时间是在处理一个HTTP请求以复制时间过程中的一个延迟,一个人将会花费这个时间来阅读或检查来自前一个用户动作的出现在他的浏览器上的数据。思考时间计算从接收到请求(就是说,显示是在监视器上完成)一直到用户点击一个键或联合执行一个动作的时间。

要设置思考时间行为:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 在调度内容区域中,点击调度的名字。

4. 在报文延迟时间区域中,设置修改报文延迟时间延迟的持续时间为以下选项之一:

图33
图33

4.6设置运行持续时间

让你跨一个特定时间收集性能数据。

你可能对你的Web应用程序如何跨一个时间段来执行感兴趣。要做这件工作,用一个高迭代数字设置一个循环(一个不会达到的数字),然后设置调度在一个特定时间之后停止。要设置一个运行持续时间:

1. 在测试导航器中,展开项目一直到你定位到调度。

2. 右键点击调度,然后点击打开。

3. 在用户负载节中,选中在经过一段时间之后停止运行调度。

4. 在停止前经过的时间,输入一个数字,并选择一个时间单元。

图34
图34

5. 使用实例

5.1创建一个测试调度,并运行测试调度

本试验的目的是帮助学生能好的理解和实践性能测试调度的概念和使用方法。在试验中,我们将记录一个浏览并定购一个旅行的操作。并创建一个测试调度和两个用户组,两个用户组分别代表两组人群。我们将为两个用户组设置用户数量的百分比,这样在测试调度运行时,就可以模拟出两组不同的用户按照一定比例对目标网站产生的负载。

步骤:

1. 录制一个性能测试。命名为 test。

2. 浏览器窗口打开。输入http://localhost/ab/main.screen ,点击回车键。

3. 点击页面中的 Island Adventures 链接。



4.点击 Maui Survival Adventure 链接。


5. 点击 Select Package 按钮。

6.点击 Set Package Options 按钮。

7.关闭浏览器。Performance Tester 自动生成测试脚本,并在测试编辑器中打开。


8.在项目视图中右键点击项目 ProjectTest ,选择新建>性能调度。


9.在性能调度窗口的文件名域,输入调度1作为性能调度名。点击完成。


10.在测试导航器视图中调度1出现在项目 ProjectTest 项目中。


11.选中调度1,在调度内容区域,右键点击调度1,选择添加>用户组。


12.加上原有的用户组1,调度1已经有了两个用户组(用户组1和2)。


13.为用户组起一个有意义的名字。选中用户组1,在调度元素详细信息区域,在组名域,输入客户组1。同样的操作将用户组2改名为客户组2。


14.设置用户组的组大小参数。选中客户组1,并在组大小域,选中百分比,输入30。


15.选中客户组2,并在组大小域,选中百分比,输入70。


16.为用户组添加测试。选中客户组1,右键点击并选择添加>测试。


17.在选择性能测试对话框中,选择项目 ProjectTest 下的测试test。点击确定。


18.客户组1下,出现了测试test。同样的操作为客户组2添加测试test。


19.为调度1设置启动用户数量。点击调度1,在调度元素详细信息区域的用户负载选项中,在用户数量域输入5。


20.运行调度1。右键点击测试导航器中的调度1,选择运行>性能调度。

21.调度被运行,一段时间后,测试完成,测试日志打开。在摘要日志页面,你能看到已完成的用户数为5。

22. 关闭日志。

6.总结

负载分析就性能测试的基础和依据,如果没有合理的负载分析,即便使用再好的测试工具也无法真实的模拟出用户的负载。本文对负载分析进行了介绍,并展示了如何在 Rational Performance Tester中实现负载分析。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号