一、基本概念
性能测试在软件的质量保证中起着重要的作用,中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和对瓶颈的预测。
性能测试是指测试在一定条件下系统行为表现是否符合需求规格的性能指标。
1. 响应时间
响应时间是指“对请求做出响应所需要的时间”,可分解为网络传输时间、应用延迟时间、数据库延迟时间等。图7.1描述了Web应用的页面响应时间构成,页面的响应时间分解为“网络传输时间”(N1+N2+N3+N4)和“应用延迟时间”(A1+A2+A3),而“应用延迟时间”又分为“数据库延迟时间”(A2)和“应用服务器延迟时间”(A1+A3)。
2. 并发用户数
并发分为如下两种情况:一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作,这种操作一般指做同一类型的业务。
另一种是广义范围的并发,与前一种并发的区别是,多个用户对系统发出了请求或者进行了操作,其请求或者操作可以是相同的,也可以是不同的。对整个系统而言,仍然是有多个用户同时对系统进行操作。后一种并发包含前一种并发,而且后一种并发更接近用户的实际使用情况。
实际的性能测试,测试人员比较关心业务并发用户数,也就是从业务角度关注应该设置多少个并发数比较合理。
下面给出估算并发用户数的公式。
(1)
(2)
【例7-1】 一个软件系统每天大约有400个用户访问。用户在一天之内有8小时使用该系统,从登录到退出该系统的平均时间为4小时。
【解答】 根据公式(1)和公式(2),得到:
C=400×4/8=200 200+3×√200=242
3. 吞吐量
吞吐量是指在一次性能测试过程中网络上传输数据量的总和。一般来说,吞吐量用请求数每秒或页面数每秒来衡量。从业务角度分析,吞吐量用访问人数/天或者处理业务数/小时等衡量。其中,吞吐率 = 吞吐量/传输时间,体现软件性能承载能力。
吞吐量指标有如下两个作用:
(1) 协助设计性能测试场景,以及衡量性能测试场景是否达到了预期的设计目标。在设计性能测试场景时,吞吐量用于协助设计性能测试场景,通过估算吞吐量数据,测试场景的事务发生频率等。
(2) 协助分析性能瓶颈。吞吐量是性能瓶颈的重要表现形式。因此,有针对性地测试吞吐量,可尽快定位到性能瓶颈所在位置。
吞吐量和并发用户数之间存在一定的联系。计算公式如下所示:
(3)
其中,F表示吞吐量;Nvu表示虚拟用户个数;R表示每个虚拟用户发出的请求数量;T表示性能测试所用的时间。遇到性能瓶颈状况,吞吐量和VU数量之间就不符合公式(3)了。图7.2为吞吐量—VU数量关联图。
4. 性能计数器
性能计数器是描述服务器或操作系统性能的一些数据指标,具有“监控和分析”作用。例如,Windows系统的内存数、进程数、系统缓存等都是常见的性能计数器。与性能计数器相关的“资源利用率”,是指系统各种资源的使用状况。
5. 休眠时间
休眠时间又称为思考时间,是指用户请求的间隔时间。在交互式应用中,用户不大可能持续不断地发出请求,一般模式是用户发出一个请求,等待一段时间,再发出下一个请求。因此,自动化测试模拟用户操作就必须在测试脚本中让各个操作间隔一段时间,在操作语句之间设置Think函数,实现两个操作之间的等待时间。
休眠时间与迭代次数、并发用户数和吞吐量之间存在一定关系。公式(3)说明吞吐量是VU数量Nvu、每个用户发出请求数R和时间T的函数。其中R可以用时间T和用户的思考时间Ts来计算,如下所示
(4)
6. 点击率
点击率是指每秒用户向Web服务器提交的HTTP请求数,作为Web应用的特有指标。Web应用是“请求—响应”模式,即用户发出一次请求,服务器响应请求,处理后返回给用户。点击是Web应用能够处理的最小单位,点击率越大,服务器的压力也就越大。需要注意的是,这里的点击并非指鼠标的一次单击操作,因为在一次单击操作中,客户端可能向服务器发出多个HTTP请求。
二、性能测试分类
(一)负载测试
1. 概述
负载测试(Load Test)是通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如响应时间、事务处理速率和其它与时间相关的方面。
负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如大量重复的行为、逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。
2. 测试的加载方式
负载测试的加载方式通常有如下几种:
(1) 一次加载。一次性加载某个数量的用户,在预定的时间段内持续运行。例如,早晨上班时间,访问网站或登录网站的时间非常集中,基本属于扁平负载模式。
(2) 递增加载。有规律地逐渐增加用户,每几秒增加一些新用户,交错上升。借助这种负载方式的测试,容易发现性能的拐点,即性能瓶颈。
(3) 高低突变加载。某个时间用户数量很大,突然降到很低,过一段时间,又突然加到很高,反复几次。借助这种负载方式的测试,容易发现资源释放、内存泄露等问题。
(4) 随机加载方式。由随机算法自动生成某个数量范围内变化的、动态的负载,这种方式可能是和实际情况最为接近的一种负载方式。虽然不容易模拟系统运行出现的瞬时高峰期,但可以模拟系统长时间的高位运行状态。
(二)压力测试
1. 概述
压力测试(Stress Test)也称强度测试,是在强负载(大数据量、大量并发用户等)下的测试,通过查看应用系统在峰值使用情况下的操作行为,发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。
压力测试可以看做是负载测试的一种,即高负载下的负载测试,或者说压力测试采用负载测试技术。通过压力测试,可以发现内存泄漏问题,还可以发现影响系统稳定性的问题。例如,在正常负载情况下,某些功能不能正常使用或系统出错的概率比较低,可能一个月只出现一次,但在高负载(压力测试)下,可能一天就出现,从而发现有缺陷的功能或其它系统问题。
微软测试实践经验表明,如果软件产品通过了72小时压力测试,则在72小时后出现问题的可能性微乎其微。所以,72小时成为微软产品压力测试的时间标志。压力测试用例的参考模板如图7.3所示。
2. 测试步骤
压力测试检查系统在资源超负荷的情况下的表现,压力测试的其中一个变种——敏感测试是指在有些情况下,数据界限内的很小范围的数据可能会引起错误的运行,或引起性能急剧下降。敏感测试用于发现可能会引起不稳定或错误处理的数据组合。
压力测试的一般步骤如下:
步骤一:进行简单多任务测试。
步骤二:简单压力缺陷修正后,增加系统的压力直到系统崩溃。
3. 性能测试、负载测试和压力测试的区分
性能测试、负载测试和压力测试常常容易混淆,难以区分,从而造成不正确的理解和错误的使用。由于负载测试、压力测试和性能测试往往在测试手段和方法上比较相似,通常会使用相同的测试环境和测试工具,而且都会监控系统所占用资源的情况以及其它相应的性能指标,因此容易产生概念混淆。
性能测试、负载测试和压力测试三者的测试目的是不同的。性能测试是为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据;而负载测试、压力测试是为了发现软件系统中所存在的问题,包括性能瓶颈、内存泄漏等。
当通过负载测试为了获得系统正常工作时所能承受的最大负载时,负载测试就成为容量测试。压力测试用于测试系统在何种极限情况下会崩溃、系统是否具有自我恢复性等,但更多的是为了确定系统的稳定性。
负载测试与压力测试区分如下:负载测试是通过逐步增加系统复杂性来测试其变化,看最后在满足性能的情况下,系统最多能接受多大的负载的测试。压力测试是通过逐步加系统复杂性来测试其变化,看最后在满足性能的情况下,施加多大压力能使系统处于失效的状态。通俗来说,就是发现系统在什么条件下其性能会变得不可接受。压力测试是一种特定类型的负载测试。
负载测试与性能测试区分如下:负载测试是为了发现系统的性能问题。负载测试需要通过系统性能特性或行为来发现问题,从而为性能改进提供帮助。从这个意义看,负载测试可以看做性能测试的一部分。但它们两者的目的是不一样的,负载测试是为了发现缺陷,只测试在一些极端条件下,系统还能否正常工作,或加载到系统崩溃而找出系统性能的瓶颈。而性能测试是为了获取性能指标,因为在性能测试过程中,也可以不调整负载,而是在同样负载情况下改变系统的结构、算法、硬件配置等来得到性能指标数据。从这个意义看,负载测试可以看做是性能测试的一种技术,即性能测试使用负载测试的技术和工具。性能测试要获得在不同的负载情况下的性能指标数据。
(三)可靠性测试
软件可靠性是软件质量的一个重要标志。美国电气和电子工程师协会(IEEE)将软件可靠性定义为:系统在特定的环境下,在给定的时间内无故障地运行的概率。软件可靠性涉及软件的性能、功能性、可用性、可服务性、可安装性、可维护性等多方面特性,是对软件在设计、生产以及在它所预定环境中具有所需功能的置信度的一个度量。
可靠性测试一般伴随着强壮性测试,是评估软件在运行时的可靠性。通过可靠性测试,确认平均无故障时间(MTTF,Mean Time To Failure)、故障发生前平均工作时间(MTTFF,Mean Time TO First Failure)或因故障而停机的时间(MTTR,Mean Time To Repairs)在一年中应不超过多少时间。可靠性测试强调随机输入,并通过模拟系统实现,很难通过实际系统的运行来实现。
(四)数据库测试
数据库测试一般包括数据库的完整测试和数据库容量测试。下面依次介绍。
1) 数据库完整测试
数据库完整测试是指测试关系型数据库完整性原则以及数据合理性测试。
数据库完整性原则是指:
(1) 主码完整性:主码不能为空。
(2) 外码完整性:外码必须等于对应的主码或者为空。
(3) 用户自定义完整性。例如性别字段的取值只能是“男”或者“女”。
2) 数据库容量测试
数据库容量测试指通过存储过程往数据库表中插入一定数量的数据,看相关页面是否能够及时显示数据。数据库容量测试使测试对象处理大量的数据,以确定是否达到了使软件发生故障的极限。数据库容量测试还将确定测试对象在给定时间内能够持续处理的最大负载或工作量。比如,通过insert customer往员工表中插入10000个数据,看其是否可以正常显示顾客信息列表页面。
(五)安全性测试
安全性测试是测试系统在应付非授权的内/外部访问、非法侵入或故意的损坏时的系统防护能力,检验系统是否有能力使可能存在的内/外部的伤害或损害的风险限制在可接受的水平内。可靠性通常包括安全性,但是软件的可靠性不能完全取代软件的安全性,安全性还涉及到数据加密、保密、存取权限等多个方面。
进行安全性测试时需要设计一些测试用例试图突破系统的安全保密措施,检验系统是否有安全保密漏洞,验证系统的保护机制是否能够在实际使用中不受到非法侵入。在安全测试过程中,测试者扮演成试图攻击系统的角色,尝试获取系统密码,利用能够瓦解任何防守的客户软件攻击系统;或者把系统“制服”,使别人无法访问。
(六)文档测试
为使软件文档能起到多种桥梁的作用,使它有助于程序员编制程序,有助于管理人员监督和管理软件的开发,有助于用户了解软件的工作和应做的操作,有助于维护人员进行有效的修改和扩充,文档的编制必须保证一定的质量。
(1) 针对性:文档编制以前应分清读者对象。按不同的类型、不同层次的读者,决定怎样适应他们的需要。例如,管理文档主要是面向管理人员的,用户文档主要是面向用户的,这两类文档不应像开发文档(面向开发人员)那样过多使用软件的专用术语。
(2) 精确性:文档的行文应当十分确切,不能出现多义性的描述。同一课题几个文档的内容应当是协调一致、没有矛盾的。
(3) 清晰性:文档编写应力求简明,如有可能,配以适当的图表,以增强其清晰性。
(4) 完整性:任何一个文档都应当是完整的、独立的、自成体系的。例如,前言部分应作一般性介绍,正文给出中心内容,必要时还有附录,列出参考资料等。
(5) 灵活性:各个不同软件项目,其规模和复杂程度有着许多实际差别。实际工作中可参阅以下原则:
① 根据具体的软件开发项目,决定编制的文档种类。
② 开发的软件系统非常大时,一种文档可以分成几卷编写。
③ 根据任务的规模、复杂性、项目负责人对该软件的开发过程及运行环境所需详细程度的判断,确定文档的详细程度。
④ 文档内容的繁简可根据国标GB 8567—88《计算机软件产品开发文件编制指南》指导进行,其中关于所建议的所有条款都可以扩展,进一步细分;反之,如果条款中有些细节并非必需,也可以根据实际情况进行压缩合并。
⑤ 程序的设计表现形式可以使用程序流程图、判定表、程序描述语言(PDI)和问题分析图(PAD)等。
⑥ 对于文档的表现形式,没有规定或限制,可以使用自然语言,也可以使用形式化的语言。
⑦ 当国标GB 8567—88中所规定的文档种类不能满足某些应用部门的特殊需要时,可以建立一些特殊的文档种类要求。这些要求可以包含在本单位的文档编制实施规定中。
(6) 可追溯性:由于各开发阶段编制的文档与各个阶段完成的工作有密切的关系,因此文档具有一定的继承关系,项目各个开发阶段之间提供的文档必定存在着可追溯的关系。例如,系统的软件需求必定在设计说明书、测试计划甚至用户手册中有所体现。
1) 系统类别
分清系统类别是掌握什么样的技术的前提。例如:系统类别是B/S结构,需要掌握HTTP协议、Java、HTML等技术;若系统为C/S结构,需要了解OS、Winsock、COM等。
2) 系统构成
不同的系统构成,性能测试就会得到不同的结果。硬件设置、操作系统设置是性能测试的制约条件,一般性能测试都是利用测试工具模仿大量的实际用户操作,系统在超负荷情形下运作。
3) 系统功能
系统功能是性能测试中要模拟的环节,是指系统提供的不同子系统,如办公管理系统中的公文子系统、会议子系统等。
2. 选择测试度量方法
经过第一步,将会对系统有清醒的认识。接下来进行软件度量,收集系统相关的数据。
度量包括如下内容:
制定规范
制定相关流程、角色、职责
制定改进策略
制定结果对比标准
3. 学习相关技术和工具
性能测试是通过工具模拟大量用户操作,对系统增加负载,所以必须熟练地掌握和运用测试工具。性能测试工具一般基于不同的软件系统架构实现,其脚本语言也不同。
由于每一种性能测试工具都有自身的特点,因此只有经过工具评估,才能选择符合现有软件架构的性能测试工具,确定测试工具后,需要组织测试人员学习工具的使用,培训相关的测试技术。
4. 制定评估标准
任何测试的目的都是确保软件符合预先规定的目标和要求。通常性能测试有如下4种模型技术用于评估。
(1) 线性投射。通过大量的、过去的、扩展的或者将来可能发生的数据组成散布图,利用这个图表不断和系统的当前状况进行对比。
(2) 分析模型。通过预测响应时间,将工作量的数据和系统本质关联起来,进行模型分析。
(3) 模仿。模仿实际用户的使用方法,反复地测试系统。
(4) 基准。定义测试作为标准,与后面进行的测试结果进行对比。
5. 设计测试用例
设计测试用例的原则是以最小的代价提供最多的测试信息,设计测试用例的目标是一次尽可能地包含多个测试要素,这些测试用例必须是测试工具可以实现的,不同的测试场景将测试不同的功能。
6. 运行测试用例
通过性能测试工具运行测试用例,需要不同的测试环境以及不同的机器配置。
7. 分析测试结果
运行测试用例后,收集相关信息,进行数据统计分析,找到性能瓶颈。通过排除误差和其它因素,让测试结果体现真实情况。不同的体系结构所采用的测试方法也不同,B/S结构的系统通常会分析网络带宽和流量对用户操作响应的影响,而C/S结构可能更关心系统整体配置对用户操作的影响。
四、网站测试
(一)、网站体系结构
网站属于客户/服务器软件类别,相对于一般的窗口软件有其明显的特点,如图7.4所示,网站的结构模型由以下几部分组成。
(1) 第一部分是用户界面,提供使用者交互操作平台,用于数据输入和信息获取。
(2) 第二部分负责将输入数据进行处埋,送到下一层,也负责将下一层传回的数据显示在用户界面。
(3) 第三部分负责将上一层传来的数据按照需求规格中特定的业务规则及设定的逻辑进行处理,传送到数据存储层。
(4) 第四部分是数据存储,一般使用数据库方式。
(二)、网站测试内容
在网站测试中主要进行以下项目的测试:
(1) UI测试。UI测试主要测试页面是否美观(包括页面的布局是否合理,策划是否舒服美观,页面长度是否合理,前景色与背景色是否搭配,页面风格是否统一)。
(2) 链接测试。链接测试用于测试点击链接时是否可以进入所找的页面,是否能正确返回,链接页面会不会是空白页面、孤立页面或根本没链接(也就是说链接的是自己本身)。如果链接的是空白页,我们是否可以正确返回;如果使用了框架或内嵌框架,是否可以正确在本框架页内显示要查找的页面;使用内容置顶时是否可以正确实现。
(3) 表单测试。表单测试包括单选按钮、复选框、文本框、密码项、菜单项和提交按钮类按钮的测试以及后台数据库的测试。
(4) 兼容性测试。兼容性测试是指在各种配置不同的操作系统上和分辨率不同的电脑上及使用不同的浏览器对其测试,看其是否可以正确显示,是否有图片和页面错位或太大太小等问题使有的部分无法看到,是否有图片或视频无法显示等。
(5) 网络配置测试。网络配置测试主要测试网页是否可以打印或保存(如果是保密的网页或不想让别人保存的页面可以将其做成Flash格式的,不让用户保存),网页冗余代码是否过多或容量太大导致网络运行速度过慢等。
(6) 负载测试。负载测试主要测试多个用户同时上网时其最大的承受能力是多大,如果超过了这个极限会有何反应。
(7) 安全测试。安全测试主要测试用户名和密码是否有长度限制,是否有复杂度限制,登录次数是否受限等。
(8) 接口测试。
一、判断题
1. 负载测试是验证要检验的系统的能力最高能达到什么程度。( )
2. 所有软件必须进行某种程度的兼容性测试。( )
3.以消除瓶颈为目的的测试是覆盖测试。( )
二、简答题
1. 请解释如下名词概念。
响应时间 并发用户数 吞吐量 性能计数器 休眠时间 点击率
2. 负载测试与压力测试有哪些异同点?请举例说明。
3. 什么是可靠性测试?请举例说明。
4. 什么是安全性测试?它与可靠性测试有什么区别?
5.文档的编制有什么特点?
6.网站测试内容有哪些?