1、概念、术语定义、基础数据、压力度量
概述
在性能测试过程中,很重要的一个部分就是评估待测系统在一定压力下的性能表现。比如系统上线后,真实的性能到底如何?两年后系统的使用用户增加后,性能又如何?这些都是性能测试中,项目相关人最关心的问题。
所谓的性能表现,说的更直观一些,其实就是用户体验。用户不会在乎系统的处理能力是多少、吞吐量是多少,他们能够感受到的只是系统能否处理他们的请求、处理的速度有多快。
这里提到的一个关键词是“一定压力”,这个压力指的是系统在预期的线上场景中所承受的压力。只有准确的定义和模拟预期的压力,才有可能获取到实际场景中真实有价值的用户感受,而不是那些只存在理论意义的数据指标。
压力是由用户产生的,那么如何准确的定义和模拟用户的行为,也就成了问题的关键。
以往的性能测试中,用户的具体行为是由性能测试人员敲定的[1] 。性能测试以外的人员,大概只能了解性能测试会模拟多少个用户,针对哪些模块或者功能做测试,更进一步的还会明确虚拟用户的工作量和所需的时间。这些内容一般也就是性能测试方案中所描述的测试场景。
但这些信息仍然无法准确的对压力进行描述。比如同是100个虚拟用户,每个人需要在1小时内完成一定量的工作,如果这些用户在时间分布上是一个接一个的使用系统,那么对服务器来说,可能就和单个用户没有区别。再比如同是100个用户在线,每个人间隔30秒操作一次和间隔60秒操作一次,压力可能就会相差一倍。而这些直接影响到测试结果和有效性的细节,测试执行人以外的人员一般无法了解,有时恐怕性能测试人员自己都不明确,完全靠制作脚本过程中发挥,导致测试过程比较随意,测试结果的有效性也大打折扣。
有可能对测试结果产生影响的因素主要包括:活跃用户数量、用户活跃时间、用户操作频率(思考时间)、用户操作路径、系统访问量随时间分布、各页面访问量(工作量)分布等等。对这些因素考虑的越准确,测试的结果才会越有效。
本文正是试图对上述内容进行标准化的描述,制定一种规范的分析方法。通过此方法,让测试人员更准确的设计测试场景,让其他人员有机会了解到具体的测试过程,并且能对其进行监督和检查。最终达到“不同测试人员应该测出相同的测试结果”这一目的,也就是获得准确有效的性能测试结果。
本方法无法取代数据分析,而是应该作为其的一个应用,可以直观有效的对用户行为以及系统的压力做出描述,测试人员、开发人员、管理者和业务人员等所有项目相关人都会从其中受益。
术语定义
虚拟用户(Vuser)
性能测试中模拟的用户,用户的行为由测试脚本定义。
在线用户(或活跃用户)
一个时间段内,与服务器保持交互的用户,也称为活跃用户。需与论坛或者QQ上常见的“在线人数”定义区分,该类系统的在线用户不一定是活跃用户,在线只是一种状态。但在业务类系统中,一般只考虑活跃用户,可认为与在线用户通用。
相对并发用户
类似活跃用户,表示单位时间段内与服务器保持交互的用户,这些用户在理论上有同一时刻(即绝对并发)进行操作的可能(对这种可能性的度量称为并发度)。相对并发的说法主要是为了区分绝对并发,尽量避免使用“并发”这个容易引起歧义的术语。
绝对并发用户
同一时间点(严格的说是足够短的时间段内)与服务器进行交互的用户,一般通过测试工具提供的并发控制(如LR的集合点)实现。
并发度[2]
在一个时间点上,可能与服务端进行交互的用户的数量,它表达的是“绝对并发”的一种可能性。
思考时间
用户每个操作后的暂停时间,或者叫操作之间的间隔时间,此时间内是不对服务器产生压力的。
活跃时间
用户与服务器进行交互的持续时间。
基础数据
此分析方法依赖于以下基础数据,基础数据的详尽程度将直接决定此模型的有效性和准确性:
- 系统的访问量随时间分布关系。可以直观的观察到使用压力是如何分布在一天(一段时间)之间的,通过此数据来构建性能测试场景。
- 用户的活跃时间(与系统进行交互的时间)。用户的活跃时间是进行系统并发度估算的基础。比如已知系统的使用压力集中在4个小时内(平均分布),此期间访问量为100,用户的平均活跃时间是30分钟,那么并发度估算为100/(4h/30min)≈12.5。
- 用户操作路径。完成一个典型业务可以通过哪些途径?更有效提高测试覆盖率。
- 系统的访问分布。哪些页面是用户经常访问的,用以选取性能测试将覆盖的功能点。也可以通过此数据来对用户的工作量进行估算,这是确定系统压力很重要的一项信息。
- 页面停留时间(请求间隔时间)。属于测试的细节,可以使脚本更加真实的模拟用户操作。
注:此类数据可能需要专门采集才能获取。性能数据的采集参见另一文档《性能数据采集分析系统.docx》。
压力的度量
- TPS:每秒钟(关键)事务数。
- 并发度:单位时间段(一般为用户活跃时间)内,理论上有可能发生绝对并发的用户数。
- 活跃用户数:一段时间内与系统进行交互的用户数量。
- 单位时间工作量:比如一小时或一分钟内完成的工作量。
[2]参见相关文章,性能测试中“并发度”的意义
2、用户模型图
用户模型
用户的行为主要分为两部分来考虑,一是针对一类特定角色的用户,二是针对整个用户群体。通过一组图形来描述用户的行为、操作路径以及系统各部分的使用率,此种方法称之为用户模型(或者系统使用模型)。
用户模型表示的是系统的使用场景,更准确的说是一个特定时间段的系统使用情况。操作路径是用户模型的核心,通过用户模型,每个人都可以轻易的理解系统是如何被使用的。
基本图形:
数量或百分比
用户类型
动作类型
同步点(集合点)
选择或数据
条件
循环
退出
分支
合并
扩展图形
随机顺序访问
应用示例
下面以一个在线书店为例,假设我们已经得知以下信息:
- 有4种类型的用户:新用户、已注册用户、供应商、管理员。
- 所有的用户都从主页开始。
- 新用户和已注册用户可以做如下操作:
- 通过标题、作者、关键字搜索图书
- 添加到购物车
- 新用户可以注册成为会员。
- 会员可以登录、修改帐户信息、下订单、查看订单状态
- 管理员和供应商必须从主页登录,然后进入管理页面。
- 管理员可以添加新书、查看订单状态、更改订单状态、取消订单
- 供应商可以查看库存和销售的统计报表。
首先为每个类型的用户分别绘制模型图。根据已知数据来制定用户的操作路径、操作比例。
新用户[1]
解释:假设有100个新用户,其中33个会进行多次搜索,有5个用户会因为没有找到相关书目而退出系统。其他的95个用户都可以找到所需书目并将其放入购物车中,这时会有20个用户没有创建账号直接退出,其他的75个用户都选择了创建账号。之后有45个用户成功提交了订单,另外30个只是保存了订单。最后有60个用户是通过直接关闭浏览器退出系统的,选择注销的只有15个。
会员
解释:100个会员,有一半是进行买书流程的,还有一半是进入账号进行信息维护和查看订单状态。
管理员
解释:管理员操作都需要从登录管理页面开始,操作最多的是查看订单状态(50%),其中有一半的订单需要修改,增加书目和取消订单都占25%。
供应商
解释:供应商也需要从管理员页面登录。供应商用户只能进行查看报表操作,可以选择多种不同类型的报表进行统计,平均每个用户需要查看3种报表。
确定了各个用户角色的模型后,再根据各用户所占的比例,合并成整体用户群的使用模型。
解释:从整体考虑,新用户占20%,会员70%,管理员4%,供应商6%。不同类型的用户通过不同颜色来标识,所有的用户都需要从主页开始访问系统。此模型反应了系统的整体使用情况,也即测试场景需要模拟的压力。而测试场景中具体要执行的测试脚本,则主要根据各类型用户各自的用户模型来开发。
在绘制出模型图后仍然需要不断的同技术人员、业务人员沟通讨论,找出模型中不合理或者遗漏之处,并逐步完善,直到共同确认。甚至是测试结束后,也需要根据系统实际运行环境来不断调整,为后续的测试提供更准确的模型。
但只依靠模型图仍然不能有效的对压力进行描述,可以发现前文提到的种种基础数据信息目前还未得到使用,如用户操作的间隔时间、页面上需要输入的数据等等。没有模型,这些数据是缺少实用意义的;没有数据,模型图也无法得到应用。
[1]分支百分比的两种表示方式:一是各分支的数值之和等于前一个节点的数值(本文采取的方式),二是各分支的数值之和总等于100%。两种方式各有优点:第一种的图形更直观,对观察者来说每一处的压力大小一目了然。第二种对于脚本的实现者来说更容易,实现测试脚本时无需再次换算,而且如果某一个节点有修改,无需考虑后续节点。
基础数据分析
以下图表均取自互联网,本文是在“已经获取所需数据”的前提下,讲解性能测试的一些设计思路。至于如何才能取得这些数据,将在后续的文章中说明。
系统访问量分布
由系统的日访问量分布图,可知系统的访问压力集中在哪个时间段内。系统的压力是在一天中平均分布的,还是集中在某几个更小的时间段内。根据此信息,我们对测试场景的时间进行设计,如从分布图中明显看出每天的大部分访问量集中在9:00~11:00和14:00~16:00两个时段,那么就可以设计2小时内完成一半访问量的测试场景。
用户的平均活跃时间
用户活跃时间,是指用户一次使用系统的时长,可用来指导测试脚本的设计,即每个虚拟用户脚本应该在多长时间内执行完。
由系统访问量分布和用户活跃时间两个数据,可以对系统使用的并发度进行估算。比如已知系统在2个小时内有200访问量,且分布接近于平均,用户的平均活跃时间为30分钟,那么此时间段的并发度应为:200*30/120=50。这里并发度50传递的信息是,在一个用户活跃周期内,总共会有50个用户与服务端进行交互(即相对并发)。也就是说任意时间点,最大的绝对并发可能性是50,当然实际可能远低于此,可以根据业务特点再乘以相应比例进行估算。
在性能测试时,可以依据此数据设计系统高峰期压力的测试场景。比如我们已知,系统压力最大时,单位时间段内活跃用户有100人(并发度100),那么这种压力场景,就可以以用户平均活跃时间为测试时间段,启动100个虚拟用户并在该时间段内完成各自的工作量。
页面停留时间
即请求之间的间隔(思考)时间,如在编辑页面上停留多久才会点提交按钮。如果无此数据,性能测试脚本只有运行时长是有数据(活跃时间)支撑的,脚本中的各请求之间的思考时间,只能通过常规判断和猜测,由性能测试人员自己掌控。收集到此数据后,性能测试脚本会更加符合真实用户的操作习惯,更加接近真实用户。
热点模块(页面)
分析系统各模块或页面的访问频率,可以用来检查性能测试是否设计了足够的覆盖、是否遗漏的用户频繁使用的功能,并据此对用户模型进行完善。
此外,此数据可用来分析各模块或功能所涉及到的工作量,如每天平均完成多少次提交操作、多少次统计操作。这对于确定系统的使用压力有很大的作用。
场景数据
最后,综合所有数据,为特定测试场景制订出成如下表格:
总体 | ||
| 场景名称 | 100用户负载场景 |
| 场景描述 | 模拟系统使用高峰期时,在2小时左右有100用户的访问 |
| 场景时长 | 2h |
| 场景加载策略 | 每4.5分钟加载5个虚拟用户。因为要在2小时内完成100用户的访问,而每个用户的运行时间在30分钟左右,那么在1小时30分钟时就最后一批用户就要开始访问系统,即90分钟内加载100个用户。 |
| 虚拟用户数 | 100 |
| 用户模型 | 见XX用户模型 |
| 虚拟用户运行时间 | 30min |
| 平均思考时间 | 30~60s |
| 场景并发度 | 25。 虚拟用户数*(虚拟用户运行时间/场景时长) |
操作说明 | ||
登录 | Think Time | 平均8s,最小5s,最大20s |
Pass/Fail 条件 | 如果失败,重试一次,依然失败就中止。 | |
数据 | 每虚拟用户使用不同的账号 | |
... |
|
|
可以说,用户模型表达的是,系统运行中的压力是如何分布的。
而场景数据表达的是,要给系统施加多大的压力。
只有结合用户模型和场景数据两部分,才能构造出一个确定的负载场景。
如果到这里都已经做好,并且经过了技术负责人和业务负责人的确认,那么接下来要做的就是按照设计来实现测试脚本了。