注:删除线显示的部分代表不常见或者我们课程内容没有太多涉及
1、性能测试包含了哪些软件测试(至少举出3种)?
参:负载测试;压力测试;容量测试;
负载测试(Load Testing):负载测试是一种主要为了测试软件系统是否达到需求文档设计的目标,譬如软件在一定时期内,最大支持多少并发用户数,软件请求出错率等,测试的主要是软件系统的性能。
压力测试(Stress Testing):强度测试也就是压力测试,压力测试主要是为了测试硬件系统是否达到需求文档设计的性能目标,譬如在一定时期内,系统的cpu利用率,内存使用率,磁盘I/O吞吐率,网络吞吐量等,压力测试和负载测试最大的差别在于测试目的不同。
容量测试(Volume Testing):确定系统最大承受量,譬如系统最大用户数,最大存储量,最多处理的数据流量等。
或者在下面选择几项:
并发测试 - 测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题
基准测试 - 比较新的或未知测试对象与已知参照标准(如现有软件或评测标准)的性能。
争用测试:- 核实测试对象对于多个主角对相同资源(数据记录、内存等)的请求的处理是否可以接受。
性能配置 - 核实在操作条件保持不变的情况下,测试对象在使用不同配置时其性能行为的可接受性。
负载测试- 核实在保持配置不变的情况下,测试对象在不同操作条件(如不同用户数、事务数等)下性能行为的可接受性。
强度测试- 核实测试对象性能行为在异常或极端条件(如资源减少或用户数过多)之下的可接受性。
容量测试- 核实测试用户同时使用软件程序的最大数量
2、请问什么是性能测试、负载测试、压力测试?
性能测试是指在一定的条件下(指定的软硬件,网络环境等)通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
负载测试、压力测试参如上题。
3、在给定的测试环境下进行,考虑被测系统的业务压力量和典型场景?
负载测试
负载测试是用来测定系统饱和状态、确定阀值。其特点有:
(1) 这种方法的目的是找到系统处理能力的极限;通过“检测、加压、阀值”手段找到如“响应时间不超过10秒”,“平均CPU利用率低于65%”等指标。
(2) 这种性能测试方法需要在给定的测试环境下进行,通常也需要考虑被测系统的业务压力量和典型场景、另外HP Mercury LoadRuner在使用该方法进行“加压”的时候必须选择典型场景。
(3) 这种性能测试方法一般用来了解系统的性能容量,或者是配合性能调优的时候来使用。特别是该的Weblogic 和库的性能调优。
4、什么时候可以开始执行性能测试?
在产品相对比较稳定,功能测试结束后。灵活性比较强。
5、简述性能测试的步骤。
熟悉应用
了解应用的架构、功能逻辑
测试需求
1、需要将开发给定的需求转为吞吐量和响应时间。
2、根据测试目的,细化需求
测试准备
测试准备包括测试客户端机器准备、测试数据准备、测试脚本编写准备。
测试执行
测试的执行中,需要监控测试客户端和服务器性能,监控服务器端应用情况:
客户端的系统资源(cpu、io、memory)情况
服务端的系统资源(cpu、io、memory)情况
服务器的jvm运行情况
服务端的应用情况,看是否有异常
响应时间、吞吐量等指标
系统资源监控,linux下可以采用的工具有:vmstat、top、meminfo等。
JVM的监控,可以用jprofiler工具,linux下面的jmap、jhat等。
响应时间、吞吐量等,由grinder提供。
上述这些信息,一般在测试结束后,均需要归档整理,已备后续详细分析
每次测试运行完以后,肯定会增加很多数据,需要考虑本次执行对数据量的影响,如果数据量的变化对后续测试会有影响,则需要清理数据。
测试分析
测试结果分析,性能问题定位,测试报告评估
6、你如何识别性能瓶颈?
RBI方法
重点测试“吞吐量”指标,因为RBI认定80%的系统性能瓶颈由吞吐量造成。
按照网络、硬件、数据库、应用服务器、代码的顺序自上而下分析性能
工具:IBM、HP、OpenSource工具都支持。需使用分析模块、根据Weblogic、Oracle区别有专门的工具实现RBI。
7、性能测试时,是不是必须进行参数化?为什么要创建参数?LoadRunner中如何创建参数?
是。模拟用户真实的业务操作。
创建参数列表,用参数替换固定的文本。
8、你如何设计负载?标准是什么?
负载测试计划多少用户数量、使用什么类型的机器、以及在什么环境下进行。主要基于两个重要的文档,任务分布图和事务信息,任务分布图告诉我们在负载时间段内,某一个事务使用的用户数,高峰使用率及低峰使用率均来自该文档;事务信息告诉我们事务名及优先级,在设计场景时可以参考。
9、解释5个常用的性能指标的名称与具体含义。
响应时间、并发用户数,吞吐量,性能计数器,TPS,HPS
响应时间:指的是“系统响应时间”定义为应用系统从发出请求开始到客户端接收到响应所消耗的时间。把它作为用户视角的软件性能的主要体现。
最大并发用户数:有两种理解方式,一种是从业务的角度来模拟真实的用户访问,体现的是业务并发用户数,指在同一时间段内访问系统的用户数量。另一种是从服务器端承受的压力来考虑,这里的“并发用户数”指的是同时向服务器端发出请求的客户数,该概念一般结合并发测试(Concurrency Testing)使用,体现的是服务端承受的最大并发访问数。
吞吐量是指“单位时间内系统处理的客户请求的数量”,直接体现软件系统的性能承载能力。
性能计数器(Counter)是描述服务器或操作系统性能的一些数据指标。例如,对Windows 系统来说,使用内存数(Memory In Usage),进程时间(Total Process Time)等都是常见的计数器。
思考时间(Think Time),也被称为“休眠时间”,从业务的角度来说,这个时间指的是用户在进行操作时,每个请求之间的间隔时间。从自动化测试实现的角度来说,要真实地模拟用户操作,就必须在测试脚本中让各个操作之间等待一段时间,体现在脚本中,具体而言,就是在操作之间放置一个Think 的函数,使得脚本在执行两个操作之间等待一段时间。
TPS:Transaction per second,每秒钟系统能够处理的交易或者事务的数量。它是衡量系统处理能力的重要指标。
点击率:HPS,每秒钟用户向WEB服务器提交的HTTP请求数。
10、描述不同的角色(用户、产品开发人员、系统管理员)各自关注的软件性能要点。
用户:重点关注打开速度及响应时间
开发:重点关注响应时间和数据库交互
管理员:重点关注用户感受到的软件性能;如何利用管理功能进行性能调优;如何利用其他软硬件手段进行性能调优
11、请分别针对性能测试、负载测试和压力测试试举一个简单的例子?
性能测试例子:公司开发了一个小型项目管理系统,上线前需要做负载、压力、大数据量、强度测试等。
负载测试:逐步加压,从而得到“响应时间不超过10秒”,“服务器平均CPU利用率低于85%”等指标阀值。
压力测试:逐步加压,从而使“响应时间超过10秒”,“服务器平均CPU利用率高于90%”等指标来确定系统能承受的最大负载量。
12、请问您是如何得到性能测试需求?怎样针对需求设计、分析是否达到需求?
1.在查看需求文档,从中提取性能测试需求,
2.与用户交流,了解实际使用情况。
3.结合业务信息设计操作场景总结出需测试的性能关键指标。
4.执行用例后根据提取关键性能指标来分析是否满足性能需求。
5.根据历史项目经验来确定性能需求。
13、简述使用Loadrunner的步骤
制定性能测试计划—>开发测试脚本—>设计测试场景—>执行测试场景—>监控测试场景—>分析测试结果(具体内容可以详细说明)
如:
1、脚本编写过程(从录制或编写,到优化过程<参数化,思考时间,文本/图像检查,关联,事务和集合点设置等>)
2、性能测试场景设置分析过程
3、脚本执行和监控过程(怎么设置监控,怎么观察集合点和每个用户的执行情况等)
4、测试结果分析中常见的各种计数器(如:cpu,内存,硬盘怎么看等)
14.什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?lr中的集合点跟场景设置中全部初始化后在运行有什么区别?
在性能测试过程中,需要模拟大量用户在同一时刻,访问系统并同时操作某一任务,可以通过配置集合点来实现,多个用户同时进行某操作;
集合点可以在服务器上创建密集的用户负载,使LoadRunner能够测试服务器在负载状态下的性能。
设置集合点函数:lr_rendezvous("Meeting"); // Meeting是集合点名称
设置集合点可以让大量虚拟用户在同一时刻进行系统访问,从而做到真正的并发;而场景中全部初始化以后再运行,有可能只是做到了部分并发,并没有做到 所有用户同一时间并发。
15、为什么要创建参数?如何创建参数?
LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提交不同的数据,或者使用多个不同的值进行循环输入。这时,在LoadRunner中就可以进行参数化设置,以使用多个不同的值提交应用请求。
【参数化】:使用指定数据源中的值来替换脚本录制生成的语句中的参数。
【参数化好处】
减少脚本的大小
提供使用不同的值执行脚本的能力,更加真实的模拟现实应用。
【参数化步骤】
用参数替换Vuser脚本中的常量值
为参数设置属性和数据源
16、什么是关联?请解释一下自动关联和手动关联的不同。
【关联的定义】简单的说:就是把脚本中某些写死(固定)的数据,转变成动态的数据,或者说将前面语句的结果数据保存下来,然后在后面的语句提交请求时使用这些数据。
【需要关联的前提条件】:
客户端需要从服务器端返回数据中获取部分数据,并将这些部分数据处理后作为自己下一次请求的一部分发出。(常见的如session值)
【自动关联与手工关联的不同】:自动关联是在脚本录制过程中,VuGen会根据已经制定好的规则,自动找出需要关联的值或脚本录制完成后,执行脚本一次,通过Correlation Studio自动找出需要关联的数据,并建立关联;
而手动关联是需要录制两份相同业务流程的脚本,输入的数据要相同,利用WinDiff工具,找出两份脚本之间不同之处,也就是需要关联的数据,再通过web_reg_save_param函数手动建立关联,将脚本中用到关联的数据参数化。(或者通过经验直接去response中去找,当然这个更麻烦,效率也不高)
17、你如何找出哪里需要关联?请给一些你所在项目的实例。
1、录制两份相同业务流程的脚本,输入的数据要相同
2、利用BeyondComparePortable或是WinDiff工具,找出两份脚本之间不同之处,也就是需要关联的数据
3、通过web_reg_save_param函数手动建立关联,将脚本中用到关联的数据参数化。
示例:
通过录制两份脚本,进行对比,可知jsessionid、sap-ext-sid、sap-wd-cltwndid、sap-wd-tstamp需要进行关联。
18、哪个函数是用来截取虚拟用户脚本中的动态值?(手工关联)
Web_reg_save_param函数主要根据需要做关联的动态数据前面和后面的固定字符串来识别、提取动态数据,所以在做关联时,需要找出动态数据的左、右边界字符串。
1.函数原型:
int web_reg_save_param (const char *ParamName, 2.参数说明: ParamNam:存放动态数据的参数名称 List of Attributes:其它属性,包含Notfound、LB、RB、RelFrameID、Search、ORD、SaveOffset、Convert、SaveLen。 Notfound:指当找不到要找的动态数据时,怎么处理。 Notfound=error,当找不到动态数据时,发出一个错误信息,为LoadRunner的默认值。 Notfound=warning,当找不到动态数据时,不发出错误信息,只发出警告,脚本会继续执行下去不会中断。 LB:动态数据的左边界字符串,该参数为必选参数,并区分大小写。 RB:动态数据的右边界字符串,该参数为必选参数,并区分大小写。 ORD:指提取第几次出现的左边界的数据,该参数为可选参数,默认值是1。假如值为All,则查找所有符合条件的数据并把这些数据存储在数组中。 Search:搜寻的范围。可以是Headers(只搜寻Headers)、Body(只搜寻Body部分,不搜寻Headers)、Noresources(只搜寻Body部分,不搜寻Header与Resource)或是All(搜寻全部范围,此为默认值),该参数为可选参数。 RelFrameID:相对于URL而言,欲搜寻的网页的Frame,此属性可以是All或是具体的数字,该参数为可选参数。 SaveOffset:当找到符合的动态数据时,从第几个字符开始才存储到参数中,该参数为可选参数,此属性值不可为负数,其默认值是0. Convert:可能的值有两种: HTML_TO_URL:将HTML-encoded数据转成URL-encoded数据格式。 HTML_TO_TEXT:将HTML-encoded数据转成纯文字数据格式。 SaveLen:从Offset开始算起,到指定长度内的字符串,才储存到参数中,该参数为可选参数,默认值为-1,表示储存到结尾整个字符串。 19、你如何调试LoadRunner脚本? 通常采用以下方法调试LoadRunner测试脚本 断点 【方法】在脚本的任意一行上按右键菜单或F9增加断点。 单步跟踪 【方法】通过菜单命令VUser—>Run Step by Step或F10,可以控制脚本以语句为单位执行。 日志输出 【方法】通过日志输出函数lr_message、lr_log_message、lr_output_message输出。 20、你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。 在编写用户自定义函数之前,需要首先为函数创建外部库(DLL)文件,将这些库文件放在bin目录下,一旦库文件已经被添加并且将用户自定义函数作为参数,函数应该为以下格式:declspec (dllexport) char* (char*, char*) 21、在运行设置下你能更改那些设置? 可以修改Run Logic、pacing、Log、Think Time等,可以测试实际需要,修改相关选项。 22、你在不同的环境下如何设置迭代? 在“运行时设置”中设置,如下图所示: 23、你如何在负载测试模式下执行功能测试? 在负载测试模式下,可以通过同时运行数个虚拟用户,通过增加虚拟用户数,确定服务器在多大的负载量下,仍然可以正常运行。 一般进行核心功能操作,验证核心功能运行是否正常。简单地说就是在跑负载的同时,采用人工或者自动化的手段去验证核心功能的操作。(以ThinkSNS为例:脚本在跑负载,使用手动方式去验证我的空间能否打开) 24、什么是逐步递增?你如何来设置? 虚拟用户数随着负载时间逐渐增加,可以帮助确定系统响应时间减慢的准确时间点。 可以在“加压”选项卡中进行设置:如下图所示,将设置更改为:“每 30 秒启动 2 个 Vuser”或这其他的。 25、以线程方式运行的虚拟用户有哪些优点? 以线程方式运行的虚拟用户,在默认情况下,Controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将共享父进程的内存,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。 26、当你需要在出错时停止执行脚本,你怎么做? 取消运行设置(Runtime_setting)中的“Continue on error”复选框。 或者使用lr_abort函数。 27、响应时间和吞吐量之间的关系是什么? 1.当系统吞吐量未达到系统处理极限时,系统性能不会衰减,交易平均响应时间一般也不会递增 2.当系统达到吞吐量极限时,客户端交易会在请求队列中排队等待,等待的时间会记录在响应时间中,故交易平均响应时间一般会递增(可能是明显的激增)。 28、说明一下如何在LR中配置系统计数器? 1.以windows资源监控为例,可右键点“添加度量”,输入系统IP、选择平台类型,确定即可,详细参加LR自带操作手册。 对于监控不同类型的操作系统,需要做一些准备工作,可参见监控操作系统资源部分。 29、你如何识别性能瓶颈? 瓶颈通常产生在以下几方面: 1、网络瓶颈,如带宽,流量等形成的网络环境 2、应用服务瓶颈,如中间件的基本配置,CACHE等 3、系统瓶颈,这个比较常用:应用服务器,数据库服务器以及客户机的CPU,内存,硬盘等配置 4、数据库瓶颈,以ORACLE为例,SYS中默认的一些参数设置 5、应用程序本身瓶颈, 针对网络瓶颈,现在冒似很少,不过也不是没有,首先想一下如果有网络的阻塞,断网,带宽被其他资源占用,限速等情况,应用程序或系统会是什么情况,针对WEB,无非是超时,HTTP400,500之类的错,针对一些客户端程序,可能也是超时,掉线,服务器下发生的,需要服务器返回的信息获取不到还有一种更明显的情况,应该就是事务提交慢,如果封装事务的代码再不完善,一般造成的错误,无非就是数据提交不完整,或者因为网终原因+代码缺陷造成重复性提交。如此综合下来,肯定是考虑网络有瓶颈,然后考虑网络有问题时,怎样去优化,是需要优化交互的一些代码,还是接口之类的。 应用服务的瓶颈的定位,比较复杂,一般像tomcat,weblogic之类的,有默认的设置,也有经过架构和维护人员进行试验调试的一些值,这些值一般可以满足程序发布的需要,不必进行太多的设置,可能我们认识的最基本的就是JAVA_OPTS的设置,maxThreads,time_out之类的参数我们做借助LR,Jemeter或webload之类的工具,执行性能测试,尤其是对应用服务造成了压力,如果应用服务有瓶颈,一般我们设置的log4j.properties,日志都会记录下来。然后根据日志,去进一步确定应用服务的问题 系统瓶颈,这个定位虽说比较复杂,但是有很多前辈的经验值参考,不作说明,相信用LR的同行,也可以从性能记数器中得出一些指标值,加上nagios,cacti,可以很明显的看出系统哪些资源够用,哪些资源明显不够用。不过,一般系统瓶颈的造成,是因为应用程序本身造成的。关于这点儿的分析和定位,就需要归入应用程序本身瓶颈分析和定位了。 数据库瓶颈:现在基本上所有的系统,都离不开数据库这个后台,数据库的瓶颈可以由数据库管理员帮助我们进行数据库瓶颈定位的工作,比如:查询一下V$sys_event,V$sysstat,v$syssql之类的表,比对一下日常正常情况下的监控数据,看一下有没有异常等。其他的,诸如数据库表结构的问题(索引、主外键等),以及查询语句的优化(是select * 还是分页子查询)等等,都是常见的数据库看可能存在的瓶颈 应用程序瓶颈,这个是测试过程中最需要去关注的,需要测试人员和开发人员配合执行,然后定位,测试工程师通常是执行性的工作,比如会有脚本去运行,开发人员会结合jprofiler之类的工具,去看一下堆遍历,线程剖析的情况确定哪儿有问题。 大致是这样,没有实际操作过逐步细化分析,先可以监控一些常见衡量CPU,内存,磁盘的性能指标,进行综合分析,然后根据所测系统具体情况,进行初步问题定位,然后确定更详细的监控指标来分析。 30、如果web服务器、数据库以及网络都正常,问题会出在哪里? 问题可能出在系统本身或应用服务器、或为应用编写的代码编写中。 31、如何发现web服务器的相关问题? 可以利用web资源监控器发现web服务器相关问题,在场景执行过程中,可以利用监控器分析web服务器吞吐量、每秒点击率、每秒HTTP响应数、每秒页面下载数,以及web服务器硬件资源使用情况等。 常见web资源监视器介绍(全是免费的):http://blog.jobbole.com/88115/ 如:Performance Co-Pilot、Anturis、SeaLion、Icinga、Monit、Nagios、brainypdm、SysUsage、Zabbix等 常见的系统监视工具: sar(System Activity Recorder)、Htop、dstat、Glances、vmstat等 32、如何发现数据库的相关问题? 可以通过数据库监控器和数据资源图发现数据库相关的问题,例如在运行Controller之前,可以指定需要度量的资源,之后可以根据监控的数据,分析数据库相关的问题。 33、解释所有web录制配置? 选择录制协议、设置录制选项、选择浏览器、选择存放路径、开始录制。 34、解释一下覆盖图和关联图的区别? 覆盖图:合并两个图的内容,使用同一个X轴,合并图左Y轴显示当前图的值,合并图右Y轴显示被合并图的值。 关联图:当前活动图的Y轴变为合并图的X轴,被合并图的Y轴变成合并图的Y轴。 35、你如何设计负载?标准是什么? 负载测试计划多少用户数量、使用什么类型的机器、以及在什么环境下进行。主要基于两个重要的文档,任务分布图和事务信息,任务分布图告诉我们在负载时间段内,某一个事务使用的用户数,高峰使用率及低峰使用率均来自该文档; 事务信息告诉我们事务名及优先级,在设计场景时可以参考。 36、Vuser_init中包括什么内容? Vuser_init中包含在脚本执行过程中只需执行一次的脚本。一般来说,所有需要初始化的操作都可以放在vuser_init里面,比如登录。(通常是执行前置条件) 37、 Vuser_end中包括什么内容? vuser_end中一般包含退出的过程,比如退出系统,主要在脚本执行完成或停止时运行,在设置了迭代次数时,vuser_end和vuser_int均只执行一次。 38、什么是think time?think_time有什么用? 思考时间:用户在各步骤之间停下来进行思考的时间,由于用户基于其经验水平和目标而与应用程序进行交互操作,因此技术水平更高的用户工作起来可能会比新用户要快。 通过启用思考时间,可以使 Vuser在负载测试期间更准确地模拟其对应的真实世界用户。 39、解释以下函数及他们的不同之处。 lr_debug_message:发送调试信息到输出窗口或业务监控日志文件中 lr_output_message:发送日志信息到输出窗口或业务监控日志文件中 lr_error_message:发送错误信息到输出窗口或业务监控日志文件中 lrd_stmt:赋予一个SQL语句用于处理 lrd_fetch:获取结果集中的下一行数据 40、什么是吞吐量? 客户端每秒从服务器接收到的数据,或系统服务器每秒能处理通过的交易数。一般随着虚拟用户数的增加,吞吐量也增加,说明网络带宽比较充足,反之,吐过随着虚拟用户数的增加,吞吐量比较平稳,呈直线状态,则说明网络带宽成为瓶颈,了数据传输。 41、场景设置有哪几种方法? 面向目标的场景设置和手动场景 42、假设在测试过程中发现某些事务的响应时间过长,但分析应用服务、数据库服务以及网络都属于 正常现象,问题可能出现的原因? 1、 LR客户端机器是否已无法承载当前运行压力导致LR无法及时获取从服务端返回的信息 2、Think_time(即思考时间)是否已忽略 3) 确定当前被测系统架构,是否为在每次测试过程中清除缓存所导致 43、如何发现应用服务的相关问题? 1、通过某些事务的运行,判断是否在应用代码层未进行调优导致事务响应事件过长 2、通过实时监控工具(nmon等)监控分析: a.在系统运行过程中CPU是否稳定运行或CPU耗用是否过高 b.在系统运行过程中其内存是否存在内存泄露现象 3、打开应用相应日志,分析在运行过程中是否存在交易报错并获取错误原因,查看是否由于代码原因导致交易错误发生。 44、如何发现数据库的相关问题? 1、通过运行某些相应的已获取的SQL语句,判断是否由于数据库索引所导致的事务响应过长的问题发生 2、通过实时监控工具(nmon等)监控分析: a.在系统运行过程中CPU是否可稳定运行或CPU耗用过高; b.在系统运行过程中其内存是否存在内存泄露等现象。 45、常见性能监控SQL语句: 地址:https://www.2cto.com/database/201609/5468.html 46、LR中的API分为几类? a.通用的API:,就是跟具体的协议无关,在任何协议的脚本里都能用的; b.针对协议的:像lrs前缀是winsock的;lrd的是针对database; c.自定义的:这个范围就比较广了; 47、HTTP的超时有哪三种? HTTP-request connect timeout HTTP-request receive timeout step download timeout下载本文
, LAST);