一、性能测试基础 1、定义:基于协议模拟用户发出请求(业务的模拟),对服务器形成一定的负载,来测试服务器的性能指标是否满足要求。 2、关注点:时间性能、空间性能 3、与界面无关 二、性能技术简介 1、用户行为模拟:低成本具有可行性,模拟大量用户操作的一种技术,借助这种技术将被测试系统在测试阶段运行起来,一检测系统工作是否正常 1>不同用户使用不同的数据 2>多用户并发操作 3>用户请求间的依赖关系及请求间的延时时间 2、性能指标监控:通过上面技术模拟用户的行为,在系统运行中需要监控各项性能指标,并分析指标的正确性 1>请求响应时间监控 2>服务器处理能力监控 3>服务器资源利用率监控 3、性能调优:通过指标的监控发现系统存在的性能缺陷,利用分析工具,定位修正性能问题 三、性能测试分类 1、性能测试(狭义) 通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能要求,在特定的运行条件下验证系统的能力状态。这种方法是对系统性能已经有了解的前提,并对需求有明确的目标,并在已经确定的环境下进行的。 2、负载测试 通过在被测系统上不断加压,直到性能指标达到极限,例如“响应时间”超过预定指标或某种资源已经达到饱和状态。 3、压力测试(强度测试) 让系统在一定饱和状态下,例如cpu、内存在饱和使用情况下,系统能够处理的会话能力,以及系统是否会出现错误,即让系统处在很大强度的压力之下,看系统是否稳定,哪里会出问题。 4、并发测试 通过模拟用户并发访问,测试多用户并发访问同一个应用、同一个模块或者数据记录时,是否存在死锁或其他性能问题。即,多个用户同时(并发)对一个模块或操作进行加压。 5、配置测试 关注点是微调,通过对软硬件的不断调整,找出他们的最佳状态,使系统达到一个最强的状态。 6、可靠性测试(稳定性测试) 在系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。 四、性能指标 1、举例: 并发用户数:同时进店剪发顾客数 响应时间:从进店到完成剪头的总时间(等待+执行时间) 单位时间事务数tps:Transaction per second,单位时间内完成事务的数量,事务:剪头 2、响应时间 =网络传输时间+服务器处理时间,不包含前端页面渲染时间,到浏览器收到请求后响应数据截止 3、tps tps:每秒处理的事务数 hps:每秒发送的请求数 吞吐量:描述的是服务器的处理能力 4、资源利用率 在一定的负载情况下,服务器资源占用的情况 CPU利用率:不允许超过70%-80%,队列长度 内存利用率:80%以下,页交换频率(物理内存和虚拟内存交换频繁程度) 带宽利用率:100Mbps = 12.5 Mb/s 1Byte = 8 bit 如果资源利用率太小,造成资源浪费 5、用户数 并发用户数:在同一时间向服务器发送请求的用户数量 与每秒的并发请求数不同,一定要确认需求的目的是并发用户数还是并发请求数。 五、性能测试流程 需求分析-》测试计划-》测试方案-》用例设计-》测试执行-》定位分析问题 1、需求分析 测试对象:常用的、核心的、重要的、数据量、并发量大的业务 确定性能指标:2/8原则,每小时的平均负载*4 测试场景: 单一场景:登录、注册、搜索、添加购物车、下单、支付 混合场景:用户使用场景、系统使用场景 2、测试计划: 测试目标 测试人员组织 压测进度安排 压力机:配置、要求、数量 风险 3、测试方案: 测试工具:loadrunner、jmeter 测试环境:数据库、服务器、架构升级、有条件的情况下 尽量和生产环境一致 测试策略:单一场景、混合场景 监控工具: Linux:nmon、rpc、jvisuaIVm、Spotlight Windows:Spotlight、perfmon.exe(windows 自带,命令行输入) 4、用例设计: 测试脚本形式:基于脚本的用例 场景设计:基于场景的用例 5、测试执行: 脚本编写 场景监控执行 运行场景 监控场景 测试报告 6、定位分析问题 后端:代码、软件(数据库、应用服务器)、硬件 前端 网络 六、工具介绍Loadrunner 1、安装 操作系统:xp、win7/win2003/win2008 windows :家庭版— 无管理员权限 专业版 旗舰版 支持浏览器:IE 8/9 安装 2、组成 脚本生成器VuGen 压力调度和监控系统Controller 结果分析工具Analysis 3、使用预览 1>用户行为录制:选择协议、录制用户交互、编辑脚本 2>生成场景负载:设计场景、监控 3>获得性能测试数据:定位性能瓶颈、生成测试报告 4、VuGen脚本录制流程: 录制脚本-》修改脚本-》创建场景-》执行场景-》配置服务器端监控环境-》添加服务器地址和计时器-》监控结果数据统计显示 1、新建脚本选择网络协议: 1、 如何选择协议: 1、自带协议探测工具Protocol Advisor 2、询问开发 3、根据以往项目经验 2、单协议脚本 3、多协议脚本 4、最近采用的 2、录制前准备: 1、选择被测系统的类型:浏览器、非浏览器 2、录制时采用的浏览器:IE,如果是64位,一定要选择program files(x86)下的ie浏览器 3、被测服务器地址 4、其他选项默认 3、开始录制 1、general-Recording-html-based script将与打开一个网页 (HTML)有关的所有请求“封装”为一个步骤,还可分为接 口有关的步骤 2、url-based script 将每一个不同url的请求封装为步骤 4、停止录制 5、脚本查看模式 首先启用自带的web类型网站 loadrunner-samples-web-start webserver-右下角绿色图标 4、脚本的组成 init、action、end三部分 init、end只能存在一个,只会执行一次,而action可分成多个部分,运行多次 5、查看脚本生成结果 View-test results 6、录制脚本选项 Start Record-options-Recording-html based(将与打开网页HTML有关的所有请求封装为一个步骤)/url based(将每一个不同的url的请求封装为步骤 -html based-user action页面形式的数据/url接口形式的数据 7、解决乱码 Start Record-options-Recording-Advanced-support charset-utf-8 8、Controller创建场景 Tools-》Create Controller Scenario-》一般使用手动场景Manual scenario-》Numeber of vuser设置虚拟用户数量-》Load generator压力机,localhost本机跑的-》 Group Name脚本名称-》Result 结果存放文件夹 Controller界面-》Design-》Run-》Start Scenario运行完-》Results-》 Analyze Results进入第三个分析组件 9、脚本回放设置Vuser-Run time setting 1>设置action迭代次数 Run logic 设置脚本迭代次数,设置的是action,可在replay log里查看运行次数 2>设置迭代时间 Pacing设置脚本运行时间间隔,1、固定等待时间fixing,2、随机时间random 3、第一次迭代开始和第二次迭代开始时间间隔 3>启用日志 log 勾选启用日志 4>Think time思考时间 5>Preference-Check启用图片和文本检查 6>Miscellaneous-以进程/线程方式运行虚拟用户 进程方式:独享一块内存,比较稳定,大约占用4M以上 内存资源浪费,可模拟的虚拟用户少 线程方式:线程之间共享一块捏u才能,可以模拟的虚拟用户多,大约占用1M~2M, 线程之间容易发生资源竞争,出现线程阻塞,不稳定 10、常用函数 LoadRunner自带函数 与编程语言相关的函数 自己编写的函数 web_url直接请求一个网页, web_link通过单击文本链接请求打开一个网页 web_image通过单击图片链接请求打开一个网页 web_submit_form代表在请求打开一个网页时需要一定的数据上传到服务器 1>web_url()打开网页 Action() { //web_url函数 web_url("open","URL=http://192.168.152.130:8080/webtours/",LAST); return 0; } 2、运行 3、检查结果,View-Test Results-Action Summary-Url open 2>web_submit_data(); 作用:模拟浏览器发出get/post请求 步骤名称:访问首页 请求地址:http://localhost:1080/WebTours/ 通过抓包工具知道是get/post方式、data数据 Insert-》New Step列出所有函数-》web submit data函数-》选择Post/Get-》Action-》切换到Data-》添加在fiddler抓到的数据 3>web_custom_request() 作用:模拟浏览器发出HTTP支持的任何方式的请求 11、变量 1>init、action、end中定义的变量是局部变量 gloabal.h中定义的变量是全局变量 全局变量用于:整个过程中固定不变的,例如URL地址、KEY、其他 2>loadrunner中变量声名必须放在函数的最前面 3>eg打印 int a = 10; lr_output_message("%d",a); //打印 return 0; 4>eg释放,避免内存泄露 定义在global.h里,全局变量 char *p = (char*)malloc(1024*sizeof(char)); //堆栈划了内存 free(p); 5>添加注释 选中代码---》Edit---》Advanced---》Comment Selection(ctrl+alt+c) 6>引入脚本 File--->Add File to Script--->aaa.h #include "aaa.h" 声明头文件 7>F1,帮助文档 8>获取主机姓名 char * my_host; my_host = lr_get_host_name(); lr_output_message("%s",my_host); 9>思考时间 lr_think_time(); 10> lr_whoami() 11> lr_get_attrib_string 12>快速定位到回放日志的地方 代码右键---》Go to replay log 13>F10,调试,一步步执行 14>F9,断点, 15>编码转换 lr_convert_string_encoding() 12、与编程语言相关的函数 1>strcpy与strcat 2>strcmp函数 比较两个字符串 3>atoi函数解析 4>sprinf 拼接字符串 5>time 6>文件操作 13、与协议相关的函数 1>web_link与web_url(get) 2>web_submit_form与web_submit_data(POST)、web_submit_form中的hidden自动发送 3>web_custom_request(OPTION、POST、GET各种方法,什么请求都能做) 4>web_add_header 5>web_get_int_property 12、错误机制分析 1>错误继续执行,容易一竿子打死 Run-time Settings--->Miscellaneous--->勾选Contine on error 2>lr_continue_on_error函数 13>日志函数解析 Ir_output_message(包括行号,会网络传播给controller)、lr_log_message(写在本地)、lr_message、lr_error_message区别 日志函数使用时注意: 1>在日志调试的时候使用,真正运行的时候尽量少用 2>在对时间敏感操作中间尽量不要加日志函数(IO是影响响应时间的) 14、参数化 1>脚本开发遇到的问题 被业务场景所迫:所有用户都输入相同的数据,不能体现出真实的业务环境 被系统体系所迫:存在缓存,不能体现出真正的性能 被系统业务约束所迫:有些系统禁止一个用户多次登录系统,也就严重到无法测试的地步 参数话机制就可以解决上述问题 1>设置参数化 想要参数化的对象-》右键-》Replace with a parameter填写参数名称和类型 工具栏设置参数值 注意:参数化文件中的测试数据最后一行应保留一个空行 2>读取参数化 lr_output_message("获取到的值为:%s",lr_eval_string("{username}")); 3>设置迭代次数 Vuser-》Run Time Settings-》Run Logic 4>运行Run 5>查看Replaylog回放log log里的每次迭代结尾后的输出结果 6>查看测试结果 View-》Test Results 12、设置参数列表详解 1>First data设置从哪行开始读 2>两个参数可以存在一张表里,不同列 3>参数化列表:File(文档)、Date(日期) 13、参数列表九种策略取值(取值顺序+何时更新) 1>A1+B1-》sequential+each iteration-》每次迭代顺序取值,只有发生迭代才会取值 2>A1+B2-》sequential+each occurrence-》每次取值的时候顺序取值,与迭代无关 3>A1+B3-》sequential+once-》顺序取值,一旦取到值后不再发生不变化,永远拿的一个值 4>A2+B1-》Random+each iteration-》每次迭代随机取值,只有发生迭代才会随机取值 5>A2+B2-》Random+each occurrence-》每次输出参数的值,值发生改变(值是随机读取,与迭代无关) 6>A2+B3-》Random+once-》一旦。。。。,就永远拿的一个值 7>A3+B1-》Unique+each iteration-》每次迭代唯一取值,当超过值的范围时 When out of values: Abort User停止运行 Continue in a cyclic manner循环取值 Continue with last value取最后一个值 Allocale Vuser in the Controller: Automatically allocate block size:块的大小,数据个数除以虚拟用户数,eg10个数据,5个用户,块的大小为2, 超过值,优先个数满足:数据数/迭代次数 Continue in a cyclic manner循环取值,循环取的最后一个数 Continue with last value循环取值,循环取的最后一个数 8>A3+B2-》Unique+each occurrence-》每次取唯一值,每次出现时,或者每次输出参数值时 与块的大小、迭代次数有关 9>A3+B3-》Unique+Once-》唯一取值,只取一次,不再更新 14、从数据库中获取参数 Parameter List---》Query Wizard 15、事务 1>什么是事务 2>添加事务:lr_start_transaction、lr_end_transaction解析 Insert Start Transaction图标(Ctrl+T) Insert End Transaction图标(Ctrl+D) 3>事务的4个状态 Pass、Fail、Auto、Stop 4>子事务的概念 Ir_start_sub_transaction 5>对事务的探讨 通过事务获得了响应时间,就够了吗 6>注意 事务中不要插入日志函数 不要插入集合点函数 尽量不要插入思考时间 Insert-》Start Transaction-》代码-》End Transaction-》运行-》查看log里该事务所耗的时间 一般录制流程: Vuser界面:录制脚本-》Tools-Create Controller Scenario-设置虚拟用户数-创建负载-》 Controller-Design界面:设置虚拟用户数-设置迭代间隔时长-迭代周期 Controller-Run界面:Window Resources----Add Measurements---Add Monitored Server Machines----输入localhost本机的监控----OK----得到计数器列表-----OK Start Scenario Results-Analysis Results Reports-New Reports 16、基础设置 1>如果ie没有启动-打开ie浏览器-设置-高级-启用第三方浏览器扩展 -安全-是否启用保护模式 2>如果脚本没有生成---》协议是否对 ---》检查录制选项---》Recording Options---》Port Mapping-换换捕获等级 3>Tools---》General Options---》Display---》Show run-time viewer during rej 开启、关闭回放界面,一般关闭 4>Run-Time Settings---》Log-Extended log---》Parameter substitution开启日志 5>Recording Options---》Advanced---》Support charset---》UTF-8修改编码,录制就不会有乱码了 6>Recording Option--->Advanced---》Recording schemes---》None-Resources--->zip根据数据类型分离录制 7>Run-time Settings--->Brower Emulation--->Simulate brower cache---Cache URLs requiring content---》是否缓存 8>Run-time Settings--->Download Filters--->Exclude addresses in list--->Add屏蔽url地址 9>Run-time Settings---》Miscellaneous->Continuue on error错误继续执行 10>lr_output_message("this is action");//输出 11>lr_output_message("参数的取值是:%s",lr_eval_string("{output}")); 参数准换成变量lr_eval_string() 变量转换成参数lr_save_sring() 12>快速创建登录名称和密码的方式 excel下拉一百条记录-》使用UltraEdit改格式-》切成列块模式-》将空白列替换成逗号-》把列模式关掉-》列头加标题,uesrname,password-》复制粘贴到loadrunner 17、关联 1>关联的定义 从服务器的响应中保存节点,左边界,右边界 2>参数化和关联的区别的阐述 3>什么时候需要关联 服务器返回的动态变化且对业务有影响的 4>web_reg_save_param 5>web_reg_save_param_ex 6>保存xml响应的参数 web_reg_save_param_xpath 18、集合点 1>集合点概念 只能在action里添加,也不要添加到事务里 2>生成集合点 insert-》Rendezvous 19、检查点 1>web_reg_find() web_find("Text Check","What=Welcome",LAST);//非注册检查点,要打开Preferences-->勾选Enable Image and text check 2>尽量使用注册检查点 检查的字符串尽量不要是中文,避免不必要的麻烦 运行时设置中的检查点选项对注册函数无效 通过检查点得到的警示:一定要在业务层面上判断是否成功,不能单单从协议层面判断 20、脚本调试的步骤 1>脚本开发原则:简单、正确、高效 2>脚本编译通过,不报错(Vugen) 3>单用户循环一次,不报错(Vugen) 4>单用户循环多次,不报错(Vugen) 5>多用户循环一次,不报错(Controller) 6>多用户循环多次,不报错(Controller) 7>对关键性的业务添加业务正确性判断 21、Control场景 1>Schedule by: Scenario:可以设置虚拟用户个数 Group:指定了虚拟用户个数 2>Run Mode: Real-world schedule:模拟真实世界,适用于长时间稳定性测试,实现高峰低谷波动 Basic schedule:让系统承受大压力,一般使用 3>运行时设置 3.1、与VuGen中的不同,各自有各自的,不要认为是同一个 3.2、Think time默认设置的不同 3.3、系统日志,真正运行的时候就设置成仅仅当错误时才发送,提高效率 3.4、事务的设置,尽量不设置事务 3.5、带宽的设置,一般不设置带宽,除非有要求 3.6、如何结束 3.6.1本次迭代完 3.6.2本轮action完 3.6.3立即结束 3.7、Miscellaneous 以进程方运行 1个虚拟用户 1个mmdrv.exe进程 以线程方式运行 50个虚拟用户 1个mmdrv.exe进程 22、负载生成器(Controller) 1>负载生成器连接 A:Start-》Load Generators创建连接 B:检查连接的电脑,开启LoadRunnner Agent Services后台服务,检查任务管理器里-magentservice.exe服务,是否生成负载生成器 2>负载生成器要保证自己不要成为瓶颈 负载机器的软硬件配置 脚本的复杂程度 23、IP Spoofer欺骗(Controller) 1>为什么需要做 1>打开ip欺骗 Scenario--->Enable IP Spoofer 2>使用ip Load Generators---添加ip,该ip下绑定多个ip 3>Loadrunner --->打开IP Wizard--->添加ip 24、集合点(Vuser) 实现更严格的并发,当达到一定条件时,释放 Ir_rendezvous("myRende"); 25、自定义数据采集 lr_user_data_point() 24、Analyze 1>Graphy--->Add New Item--->Add New Graph--->Average Trans平均事务不准确,关掉重新打开 2>拐点 3>右键-->Merge Graphs--- 24、并发用户数的计算1>平均的并发用户数:C=nL/T 2>并发用户数峰值:C' 约等于C+3*根号C n:login session数量 L:login session平均长度 T:时间长度 3>二八定律 22、性能测试方案 来源:Loadrunner软件性能测试视频教程(57节课全)掌握好就拿高薪!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili |
|