• 1. 负载压力测试-LR工具
  • 2. 说明 此PPT文档,只是对负载压力测试做一个简单的介绍,并对MI的LoadRunner工具的使用做个入门级的讲解。
  • 3. 负载压力测试的基本概念 当一个应用程序在少量用户同时使用的时候,程序可能正常运行,但是当大量用户同时使用的时候,可能就会出现功能失效、性能衰减、甚至系统崩溃。 所以我们压力测试做的就是测试在什么样的条件下系统的性能变得不可接受。
  • 4. 负载压力测试的实施步骤测试计划->测试需求分析-> 测试案例制定->测试环境、工具、数据准备->测试脚本录制、编写与调试->场景指定->测试执行->测试执行->获取测试结果->结果评估与测试报告。 (由于主要是要介绍LR工具的使用,实施步骤的每个环节不可能详细述说,部分略去)
  • 5. 负载压力测试需求分析原理之80~20原理80~20原理测试强度估算 基本概念:每个工作日80%的业务在20%的时间内完成。 例如:每天工作8个小时,那么每天80%的业务在8*20%=1.6小时内完成。 举例
  • 6. 例1: 去年全年处理业务约100万笔,其中,15%的业务处理中,每笔务需对 应用服务器提交7次请求;70%的业务处理中,每笔业务需对应用服务器提交5次请求;其余15%的业务处理中,每笔业务对应用服务器提交3次请求。根据以往的统计结果,每年的业务增量为15%,考虑到今后3年业务发展的需要,测试需按现有业务量的两倍进行。 强度估算如下: 每年的总请求数为: (100*15%*7+100*70%*5+100*15%*3)*2=1000万次/年 每天的请求数为: 1000/160=6.25万/天 <备注:每个月为20个工作日,所以1年为160天> 每秒请求数: (62500×80%)/(8*20%*3600)=8.68次 /秒
  • 7. 测试环境、工具、数据准备测试环境准备 我们实验室的测试环境与客户的实际环境是有较大的不同,我们的网络,计算机硬件软件都无法做到和客户完全相一致。我们的软件在客户那功能不正常,也许就是因为客户安装 了某个不知名的其他软件造成的。我们的压力测试需要遵循一个基本的原则:
  • 8. 搭建测试环境的基本原则要满足软件运行的最低要求。 选用与被测软件相一致的操作系统和软件平台。 营造相对独立的测试环境。 无毒的环境。小建议
  • 9. 小建议1: 很多朋友在实验室里做压力测试,用的服务器和开发人员共用一台。并不是一个独立的环境,服务器的资源其他活动所占用。不能保证测试的有效性。继续
  • 10. 小建议2 为了强调测试环境的‘真实性’,很多朋友在客户的实际环境执行测试,那么要注意: 尽可能地降低对客户现有业务地影响,挑选在夜间或者在客户业务不繁忙地时段进行。 要有很好地备份和恢复过程。
  • 11. 测试工具的安装-LR安装 具体请看LR的安装手册吧,在这里只是提提个小建议,请将LR安装包路径和安装路径都改成全英文的,很多朋友安装不上LR的原因很大部分是因为路径中有中文字符。系统配置
  • 12. (本页无文本内容)
  • 13. 数据的准备(小建议4) 很多朋友经常忽略数据的重要性,我们做压力测试的时候需要有大量的数据,比如我们测试一个查询操作,数据库表里就几行记录,这样的测试是失效的。因为该数据表没有建任何索引话,一个全表扫描也花不了什么时间,如果有大量数据的话,索引覆盖的问题都能暴露出来。
  • 14. 测试脚本的录制、编写与调试制作脚本如下步骤: 脚本录制; 查找动态数据(关联); 参数替换; 布置检查点; 单脚本回放; 脚本加压回放;
  • 15. 利用vugen制作脚本LR用Vuser(虚拟用户)来代替实际的用户。Vuser执行的操作是用Vuser脚本来描述的。 Vuser脚本生成器(也称Vugen)是LR用于开发Vuser脚本的主要工具。Vugen通过录制客户端与服务器之间的活动来录制脚本。例如:在数据库应用程序中,测试工具的脚本生成器(Vugen)会监控数据库的客户端,并跟踪发送到数据库服务器和从数据库服务器接收的所有请求。 当Vuser与服务器直接通信时,不需要在用户界面中耗费系统资源,这样就可以在一个工作站中同时运行大量Vuser,进而可以使用很少的测试计算机来模拟非常大的服务器负载。
  • 16. 启动Vugen可以从开始菜单中启动Vugen,选择‘开始’->‘程序’->‘LoadRunner’->Virtual User Generator。 打开Vugen后默认设置会弹出对话框让选择录制协议,新建Vuser脚本。如果想每次启动时不再出现那该死的对话框,可以在tools->General Options里面设置。如图:如图
  • 17. 示例
  • 18. 选择协议C/S(Client/Server)结构的win32应用程序一般可以选用winsocket协议。 B/S(Browers/Server)结构的通过浏览器浏览数据的一般选用Web(Http/Html)协议。
  • 19. (本页无文本内容)
  • 20. 选择好协议后就开始录制脚本了 。以winsocket为例; 我们要调取客户端的应用程序。(默认设置下)点击OK按钮后就开始录制了。 如图:如图
  • 21. (本页无文本内容)
  • 22. 为什么录制后的没有产生脚本?答:1,选择协议错误。 2,如果服务器和vugen在同一台电脑上的话,必须更改设置,因为在默认下是排除本地主机和Dns端口的套接字的。在Tools->Recording Option下,如图:
  • 23. Vuser的脚本 对于Vuser脚本,我们必须要了解它的组成和事务、集合点、检查点的概念。 以下的内容将对这些概念和具体的使用做阐述。
  • 24. Vuser脚本的三个部分这里我们简单讲讲Vuser脚本的三个部分: 创建的每个 Vuser 脚本都至少包含三部分:vuser_init、一个或多个 Actions 及 vuser_end。录制期间,可以选择脚本中 VuGen 要插入已录制函数的部分。通常情况下,可以将登录到服务器的活动录制到 vuser_init 部分中、将客户端活动录制到 Actions 部分中,并将注销过程录制到 vuser_end 部分中。 运行多次迭代脚本,只有脚本的Actions部分被重复,而Vuser _init和Vuser_end部分只运行一次。 如果我们测试的只是登录操作,需要登录操作循环被执行。那么我们也可以将登录操作录制在action中。
  • 25. 事务和集合点可以定义事务以度量服务器的性能。每个事务度量服务器响应指定的 Vuser 请求所用的时间。这些请求可以是简单任务 (例如等待对单个查询的响应),也可以是复杂任务 (例如提交多个查询和生成报告)。 要度量事务,需要插入 Vuser 函数以标记任务的开始和结束。在脚本内,可以标记的事务不受数量限制,每个事务的名称都不同。 在方案执行期间, Controller 将度量执行每个事务所用的时间。方案运行后,可使用 LoadRunner 的图和报告来分析各个事务的服务器性能。 要在系统上模拟较重的用户负载,需要同步各个 Vuser 以便在同一时刻执行任务。通过创建集合点,可以确保多个 Vuser 同时执行操作。当某个 Vuser 到达该集合点时, Controler 会将其保留,直到参与该集合的全部 Vuser 都到达。当满足集合条件时, Controler 将释放 Vuser。 注意
  • 26. 注意:只能向 Action 部分 (而不是 init 或 end 部分)添加集合点。
  • 27. 录制脚本的时候会产生如下图所示的控制面板: 小建议
  • 28. 小建议5 很多朋友录制脚本的时候,会使用LR的默认设置,把脚本录制到Vuser_init中,等录制完成后,再将脚本剪切粘贴到actions和Vuser_end部分中去。这是个不可取的做法,我们在录制的过程中,就应该通过上图所示的控制面板调节我们录制的操作到脚本的哪个部分。继续
  • 29. 小建议6录制C/S结构的脚本,操作动作多,数据交换量大,生成的脚本会非常的大,根本无法搞请清楚每一个BUF的具体内容。这给我们维护和增强脚本带来了困难。所以在录制的时候,我们要加必要的注释。并且以操作名来命名事务。如:我们录制脚本时打开了一个模块,是一个表,‘确定’按钮的按钮事件是在数据表中新增一条记录。那么我们在没有点击按钮之前先设置开始事务,名称为新增记录;如图:
  • 30. (本页无文本内容)
  • 31. 当新增完成后,我们要结束事务;
  • 32. Winsocket协议的脚本节选如下: lrs_send("socket1", "buf7", LrsLastArg); /* * 进入新增界面 */ lrs_receive("socket1", "buf8", LrsLastArg); lrs_send("socket1", "buf9", LrsLastArg); lrs_receive("socket1", "buf10", LrsLastArg); lrs_send("socket1", "buf11", LrsLastArg); /* * 进入查询界面 */ lrs_receive("socket1", "buf12", LrsLastArg); lrs_send("socket1", "buf13", LrsLastArg);
  • 33. 我们可以看到winsocket协议录制的脚本都是lrs_receive和lrs_send语句。我们在录制的时候就加上注释,我们就知道大概这些buf记录的是些什么内容。方便我们阅读,也使接下来要做的查找动态数据和参数化脚本来得容易些。
  • 34. 查找动态数据(关联) 我们的系统经常会有些动态的数据,如新增记录之前系统会给一个流水号,我们的脚本在录制的时候捕获了这个号码,但是每次新增流水号肯定不同,拿脚本中的原始流水号去新增记录,肯定违反数据表的主键约束 。如果我们在receive的包中找到那个流水号,并把它作为参数给send包,那么问题就迎刃而解了,这就是关联(其实也是一种参数化)
  • 35. 关联太烦了,等会再讲,我们先来了解一下Vuser脚本的两种查看方式:Script View和Tree View。我们通过View菜单条Script View和Tree View 来切换。基于图标的Tree View和基于文本的script View有各自的作用。 注意: 你在Tree View模式下点击Start Record 是会出错的。只能在Script View下来录制脚本。 如果你在查看data.ws文件,那么Vugen将不允许你切换到Tree View模式下。
  • 36. Data.ws文件是winsocket协议下脚本保存原始数据的地方。我们想要做关联,首先就是要在recv buf中找到服务器返回的动态数据,下图为在Tree View下,快照中找到动态数,将其参数化后,使得以后测试中,send buf中使用截获的数据。
  • 37. (本页无文本内容)
  • 38. 我们如果想知道偏移量,那么点击go to offset,如下图所示:
  • 39. 如果要建立关联的话,点击create Parameter.它会将send buffer中的相同字符串自动参数化,使其与该recv buffer中的值相同,如图:
  • 40. 参数化 在脚本中,框选要参数的字符,右击鼠标,选择替换为参数就可以了。用登录时参数化用户名和密码的例子来说明如何同步两个参数,即一一对应:
  • 41. (本页无文本内容)
  • 42. (本页无文本内容)
  • 43. 如何调试脚本?录制好脚本,并参数化后,我们还得确定脚本是能正常运行的,是可以模拟用户操作的,我们脚本很少能录制好后,参数化好脚本后回放时就没有错误的,出错时我们需要调试,LR的编译器提供调试脚本的功能。我们可以调试和优化我们的脚本。
  • 44. 设置断点LR也是可以设置断点的,在需要设置断点的语句前按F9快捷键,断点就设置好了,程序运行到断点语句后会暂停,这时我们可以用F10单步执行程序.
  • 45. 写log只是设置断点是不够的,我们还得知道具体发生了什么事情,Log告诉了我们一切,默认的Log是 standard Log,这时远远不够的.我们要extended log,打开路径 为runtime settings-->log-->extended log.把parameter substitution和data returned by server和advanced trace根据需要勾选 ,写log很占资源,除调试外,建议尽量减少使用。
  • 46. 脚本调试先后在单脚本回放下和加压回放下两种情况下进行。也就是在vugen中和在controller中进行。在controller中主要看在加压状态下参数是否能正确地传递。动态数据是否能正确地获得。
  • 47. Log存放的位置在vugen中运行,Log写在脚本的目录中的mdrv.log文件中。 在controller中运行,log保存在结果目录的log子目录中,结果目录在controller的ResultsResults settings 里变更。如图:
  • 48. (本页无文本内容)