1、1.什么是负载测试?什么是性能测试? 负载测试:通过被测试系统不断增加压力,直到性能指标超过预期值或者某种资源达到饱和状态。 经过这两天查看相关的资料,而且还和同事讨论。得出以下总结: 1)共同点:两种测试都是量的测试。 2)区别:压力测试是指被测对象在允许的压力值范围内进行测试。例如:一个B/S结构的应用程序,它允许有100个终端访问服务器。当有10、30、60、80个终端访问服务器时,程序的反应如何?而负载测试是指被测对象在超负荷的环境下运转。例如:就拿以上的例子来说,当有110或150个终端访问服务器时,程序的反应如何? 对性能测试、压力
2、测试、负载测试的理解 斗胆在此发表一些个人理解与看法,权作抛砖引玉,望各路英雄能各抒己见,不吝赐教。 首先,我们看一下来自百度百科的定义: 1、性能测试:是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 2、负载测试:负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。 3、压力测试:是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。 我在这里简单谈一下我对三个概念的看法。 一、性能测试 性能测试的目的是找到系统在某种条件下的瓶颈
3、前提是这种条件在软件或服务的实际应用中可能发生。例如百度主页会同时有10万人访问,这是可能的。因此测试10万个vuser同时hit是有意义的,但是会不会有10亿人同时访问?显然不会,至少在当今不会,因此测试的数据量定在10亿个vuser是无意义的,这种行为不靠谱。因此,在这一点上我们可以得出结论,具有清晰的、有意义的并且意义确定的预期值是进行一次性能测试的关键要素。 所以,我们在进行性能测试之前,首先要明确两个值:一个是系统负载预期值,一个是系统响应时间的预期值。有了这两个目标,才可以使用对系统持续增加负载的方法来观察系统的瓶颈所在。 那么性能测试就是简单的添加负载测试吗?显然不
4、是。前面说过,性能测试的目的是要找出系统的瓶颈所在,而系统的瓶颈可能存在于各种方面。在代码方面,比较差的算法、硬代码多的模块等低效率的代码可能产生瓶颈;在数据库方面,冗余或者复杂的数据可能产生瓶颈;操作系统方面,cpu、磁盘、i/o系统、总线及兼容性等方面可能产生瓶颈;而在通信传输层面上,交换(路由)的转发效率、网络硬件质量等都可能引发系统瓶颈。对于以上这些可能引发瓶颈的原因,我们可以进行所谓白盒测试来找到问题的关键。各种层面上的问题,都有相应的测试工具或测试设备的支持,如果没有合适的工具,也可以自己进行设计。例如一些cpu监控工具、代码检测、数据库事件探查器、chariot等,以及网络分析仪
5、数据分析仪等通信分析仪器。这些都是性能测试的利器。 我们在性能测试出现瓶颈时,需要及时的调试对应的系统问题,但是如果在调试完成之后,系统表现好了一些,但是仍然没有达到预期目标,这个时候我们就应该把目光放在系统的其他层面上。由于一个系统是由多个子系统协作的,因此各个子系统之间有着密切的关联性。以web系统为例,当代码层以及数据库层都进行清洗之后,还可以通过其他途径提高系统的性能,以突破瓶颈,达到预期目标。 性能测试的另外一个目的是要建立一组被测系统的基准数据,系统在同样的测试环境与测试条件下,表现应当符合或优于基准数据的要求,否则测试不通过。另外,基准数据也可以为其他类似的系统提供
6、预期数据及预期返回时间的数值参考。 二、负载测试 负载测试的范围个人认为比性能测试要狭窄一些,负载测试通常定义为给被测系统加上它所能操作的最大任务数的过程。负载测试考验系统的两个指标,一个是系统的容量,一个是系统的耐久性。 测试系统容量是指给系统添加大数据量的文件或者数据,让系统进行处理并实时观察系统的表现情况。例如大数据量文件输入让系统处理(我们很熟悉的操作,亲们知道是啥意思吧?),大访问量的输入处理等。目的是找到系统能添加负载的最大量。而测试系统耐久性则指的是给出数量巨大的任务,让系统始终处于高负荷量的运行状态,并观察记录系统表现情况的测试方式。目的是找到系统所谓
7、的“疲劳点”。例如运行多少时间之后系统返回时间开始变大,系统什么时候处理时间变得缓慢等都是考察的内容。 负载测试实现的前提是要先准备巨大的数据量,例如上百兆的文件、上万的用户等。负载测试不会以使系统崩溃为目的,因此负载测试的期望值一般以满足使用需求为主,不需要太夸张的数值。 三、压力测试 任何能使系统崩溃的测试都可以称之为压力测试。这一点我在会上已经多次说过了。 2.性能测试包含了哪些测试(至少举出3种) 压力测试、负载测试、并发测试、可靠测试、失效恢复测试。 3.简述性能测试的步骤 计划测试—测试设计—创建脚本—创建场景—分析结果 4.
8、简述使用Loadrunner的步骤 脚本录制设置—录制脚本—调试脚本—场景设置—结果分析 5.什么时候可以开始执行性能测试? 在产品相对比较文档,功能测试完成后。灵活性比较强。 6.LoadRunner由哪些部件组成? virtual user generator contorller running contorller analysis 7.你使用LoadRunner的哪个部件来录制脚本? virtual user generator 8.LoadRunner的哪个部件可以模拟多用户并发下回放脚本? contorller 9.什么是集合点?
9、设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个? 集合点:设置多个用户到达某个用户数量点集合,同时触发一个事务,以达到模拟真实环境下同时多个用户操作 ,同时模拟负载,实现性能测试的最终目的 LR_rendezvous(“集合点名称”) 10.什么是场景?场景的重要性有哪些?如何设置场景? 场景:模拟真实环境中,用户运行状况。 1.通过场景来模拟实际用户的操作,性能测试结果才具有代表性。 2.在运行过程中也需要关注场景性能测试值,测试过程是否正常。 1.选择场景中需要的脚本 2.选择为目标场景,还是指定的手工场景 3.设置用户数、设置产生负载的
10、设备 4.设置执行策略 11.请解释一下如何录制web脚本? LR通过转发请求,来捕获数据包,来形成脚本 12.为什么要创建参数?如何创建参数? 参数:在环境变化时必须时脚本具有环境变化的能力,就需要参数化(客户端发送到服务器端) 1.确定要参数话的数据 2.设定规则形式来取值 13.什么是关联?请解释一下自动关联和手动关联的不同。 关联:很多构架用sessionid等方法标识不同任务和数据,应用在每次运行时方式发送数据不完全相同, 需要利用的机制对录制的脚本进行处理,这种机制叫做关联(服务端发送到客户端) 14.你如何找出哪里需要关联?请给一些你所在
11、项目的实例。 用户登陆, 客户端发送请求后,服务端验证正确性后,发送给客户端sessionid,是某种规则产生。 15.你在哪里设置自动关联选项? 两地方可以设置 1.设置允许录制时进行自动关联,可以自定义规则 2.录制完成后,vuser-scan action for correlations 16.哪个函数是用来截取虚拟用户脚本中的动态值?(手工关联) 17.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志? Run-time,log, 当调试脚本时,可以只输出错误日志,当在场景找你管加载脚本时,日志自动变为不可用。 Standard Lo
12、g Option:选择标准日志时,就会在脚本执行过程中,生成函数的标准日志并且输出信息,供调试用。大型负载测试场景不用启用这个选项。 扩展日志包括警告和其他信息。大型负载测试不要启用该选项。用扩展日志选项,可以指定哪些附加信息需要加到扩展日志中 18.你如何调试LoadRunner脚本? VuGen有两个选项帮助调试Vuser脚本。Run Step by Step 命令和断点(breakpoints)。Option对话框中的调试设置(Debug setting)项,可以确定在场景执行过程中执行轨迹范围。 调试信息写在output窗口。可以用 lr_set_debug_mess
13、ag函数在脚本中手工设置信息类型。如果我们只想接收到一小段脚本的调式信息。
19你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。
在创建用户自定义函数前我们需要和创建DLL(external libary)。把库放在VuGen bin 目录下。一旦加了库
,把自定义函数分配做一个参数。该函数应该具有一下格式:__declspec (dllexport) char*
14、测试模式下执行功能测试? 23.什么是逐步递增?你如何来设置? Ramp up这个选项用于逐渐增加服务器的虚拟用户数或负载量。设置一个初始值而且可以在两个迭代之间设置一个值等待。设置Ramp up,请到‘Scenario Scheduling Options’。 24.以线程方式运行的虚拟用户有哪些优点? VuGen提供了用多线程的便利。这使得在每个生成器上可以跑更多的虚拟用户。如果是以进程的方式跑虚拟用户 ,为每个用户加载相同的驱动程序到内存中,因此占用了大量的内存。这就限制了在单个生成器上能跑的虚拟 用户数。如果按进程运行,给定的所有虚拟用户数(比如100)
15、只是加载一个驱动程序实例到内存里。每个进程共用父驱动程序的内存,因此在每个生成器上可以跑更多的虚拟用户。 25.当你需要在出错时停止执行脚本,你怎么做? lr_abort函数放弃虚拟用户脚本的执行。说明虚拟用户停止Action的执行,直接执行vuser_end 然后结束执行。在出现错误情况下想手工放弃脚本的执行,这个函数是有用的。用这个函数停止脚本时,Vuser被指定为“Stopped”状态。为了这个函数起作用,开始时候就不能选择Run-Time Settings中的Continue on error选项。 26.响应时间和吞吐量之间的关系是什么? 吞吐量图显示的是虚拟用户每秒
16、钟从服务器接收到的字节数。当和响应时间比较时,可以发现随着吞吐量的降低,响应时间也降低,同样的,吞吐量的峰值和最大响应时间差不多在同时出现。 27.说明一下如何在LR中配置系统计数器? 通过Web资源监视器,利用这些监控器可以分析web服务器的吞吐量、点击率、每秒http响应数以及每秒下载的页面数。 28.你如何识别性能瓶颈? 29.如果web服务器、数据库以及网络都正常,问题会出在哪里? 操作系统、代码算法、其他通信传输层硬件 30.如何发现web服务器的相关问题? 网络带宽、内存、存储、CPU、 31.如何发现数据库的相关问题? 32.解释
17、所有web录制配置? 33.解释一下覆盖图和关联图的区别? 34.你如何设计负载?标准是什么? 35.Vuser_init中包括什么内容? 36. Vuser_end中包括什么内容? 37.什么是think time?think_time有什么用? 思考时间是真实用户在action之间等待的时间。例如:当一个用户从服务器接收到数据时,用户可能需要在响 应之前等待几分钟回顾数据,这种推迟被称为思考时间。 38.标准日志和扩展日志的区别是什么? Standard Log Option:选择标准日志时,就会在脚本执行过程中,生成函数的标准日志并且输
18、出信息,供调试用。大型负载测试场景不用启用这个选项。 扩展日志包括警告和其他信息。大型负载测试不要启用该选项。用扩展日志选项,可以指定哪些附加信息需要加到扩展日志中 39.解释以下函数及他们的不同之处。 Lr_debug_message lr_debug_message 函数在指定的消息级别 // 处于活动状态时发送一条调试消息。如果指定的 // 消息级别未处于活动状态,则不发出消息。 Lr_output_message 要发送不是特定错误消息的特殊通知, Lr_error_message 函数将错误消息发送到 // 输出窗口和 Vuser 日志文件 Lrd_stmt lrd_exec 函数执行 lrd_stmt 设置的 SQL 语句。 Lrd_fetch 函数从结果集中提取后续若干行 result set. 函数准备用于 // 通过光标输出字符串(通常为 SQL 语句) // 的下一结果集。对于 CtLib,它发出 ct_result // 命令,并且在 ODBC 中它运行用于当前数据库 40.什么是吞吐量? 只单位时间内系统处理客户端的请求数。 41.场景设置有哪几种方法? 目标场景,还是指定的手工场景






