性能测试基础04
Loadrunner-Controller
目标
1. 了解目标场景搭建
2. 掌握手工场景搭建
3. 掌握LR监控服务器硬件资源指标方法
4. 掌握负载机的加载与使用
5. 了解服务水平协议的功能的作用及使用
Controller简述
1. LoadRunner Controller用来管理和维护场景;
2. 可以在一台工作(服务器)站上控制一个场景中的所有虚拟用户(Vuser);
3. 通过模拟多个虚拟用户代替真实的用户操作行为,并支持多机联合测试;
4. 充分利用有限的硬件资源,解决了手工操作不同步和人力、物力资源严重浪费问题。
Controller运行及Scenario(场景)
目标
1. 了解Controller启动方式
2. 了解什么是场景
3. 掌握Controller场景分类
为什么要学习Controller
1. 集合点需要在Controller场景中运行;
2. 性能测试就是模拟应用程序在【真实环境】中运行的情况;
(真实环境:就是需要模拟搭建各种业务场景,各种应用场景的搭建就需要Controller工具)
一、Controller运行方式
1. 从VuGen脚本直接启动Controller【已讲解】
2. 直接运行Controller 【推荐】
3. 通过LR工具管理器运行
直接运行Controller 【推荐】
通过LR工具管理器运行
1. 开始程序->HP LoadRunner->LoadRunner
2. 点击 Run Load Tests
运行
1. 运行Controller后,提示先选择场景;
思考
1. 什么是场景?
2. LR提供的场景模式有那些?
二、什么是场景
说明:一个应用程序,有不同的操作功能且支持多用户同时应用,【模拟不同的用户进行不同的操作】,就是场景;
(比如:机票网站,5个用户在进行注册业务,20个用户在进行订票操作,5个注册+20订票=场景)
三、Controller场景模式
1. 模式:
1. Goal-Oriented Scenario(目标场景)【了解】
2. Manual Scenario(手工场景)【重点】
2. 说明:
1. 这两个场景我们单独来讲解
Goal-Oriented Scenario(目标场景了解)
目标
1. 了解目标场景设计方案
一、目标场景【了解】
什么是目标场景
说明:目标场景设计就是定义要实现的【测试目标】,LR会根据根据这些目标自动构建场景。
根据性能测试,LoadRunner自动创建了五种测试目标。
(测试目标:LR提供了5种目标-虚拟用户数、每秒单击次数、每秒事务数、每分钟页面数、事务响应时间)
提示:
1. 每秒单击次数、每分钟页面数只适合Web项目;
2. 以上5种目标设置我们会逐一说明。
如何选择启动 目标场景
1) 创建目标场景
1. 启动Controller
2. Select Scenario Type:选择Goal-Oriented Scenario
3. 根据测试用例给目标场景添加相应业务(单一业务或混合业务),双击(Available)有效脚本,或选中点击Add ==>>按钮
注:
1). 单一业务:单个业务脚本
2). 混合业务:多个业务脚本【重点】
2)目标场景 图
提示:
1. 红框选中的为接下来需要关注地方
思考:如何对目标场景设计与编辑呢?
1. 启动编辑场景
2. 编辑场景
1)启动编辑场景
1. 场景默认数据:为Controller默认创建目标场景时设计的数据
2. Edit Scenario Goal:编辑目标场景-修改目标场景数据
2)编辑场景
标注1:新建场景、修改现有场景名称、设置场景启动时间
标注2:设置目标场景的测试目标类型及目标范围【相对目标场景 重点】
标注3:场景运行时间及策略设计
标注4:虚拟用户加载策略
说明:接下来我们简略说明下各标注区域常用选项
标注 1 (新建场景、修改现有场景名称、设置场景启动时间)
1. Scenario Start Time:设计完场景后,场景启动时间;一般默认即可
1). Without delay:立即运行场景 (默认)
2). With a delay of HH:MM:SS:等待指定时间运行场景
3). At HH:MM:SS on Y/M/D:指定X年X月X日X时X分X秒运行场景
2. New:创建一个新的计划场景
标注 2 【目标场景的核心】
说明:
1. Goal Type:本次性能测试的测试目标
2. 由于此选项比较重要,在接下来第二小节【二、目标场景5种 测试目标】单独讲解
我来对上图做个深入的解释:
Goal Type:目标场景类型:每秒点击数(每秒钟向服务器发送的请求或者链接(图片也是请求,只要有响应码的都是请求),针对服务器而言的) 客户端统计:服务器返回响应的状态码(请求的响应码)
服务端统计:服务器端处理客户端发过来的请求或链接等等
Reach goal 100 hits per second:
目标预期值:这里的解释是,发送给服务器的请求是 100次/秒
useing minimum of ~maxium of Vusers:
达到目标预期值所需的最小用户数和最大用户数(需要多少用户的并发才能达到每秒发给服务器100次请求)
标注3(场景运行时间及策略)
说明:
1. 标示1(Run time):场景达到目标后,继续运行多长时间;一般10-30分钟,是用来检查即使到达目标后,长时间是否会崩溃
2. 标示2(If target cannot be reached): 如果达不到设定目标时的处理方式
1). Stop scenario and save results 停止并保存运行结果
2). Continue Scenario without reaching 继续执行场景直到达到目标位置 【默认】
提示:
以上选项如没有特殊业务需求,默认即可;
标注4(目标加载行为)
1. Automatic:系统自动加载【默认】
2. Reach target number of virtual users after 00:10:00 设定10分钟后达到指定的目标
3. Step up by 20 virtual users every 00:02:00 表示以每2分钟加载20个hit加载
提示:
以上选项根据实际业务场景来选择和设定
二、目标场景5种 测试目标
1. Virtual users (虚拟用户)
2. Hits per Second (每秒点击率) # 每秒发给服务器的请求,统计的是服务器的响应码,根据服务器的响应码来统计的。
3. Transactions per Second (每秒事务数) # 服务器每秒处理的事务数
4. Transaction Response time (事务响应时间) # 服务器处理事务响应给浏览器的时间
5. Pages per Minute (每分钟页面数) # 它的意思是每分种读取的页面个数,它体现的是页面的交换活动的一个指标.
提示:
1). Hits per Second、Pages per Minute只适合用于Web项目
Virtual users(虚拟用户)
Virtual user目标:测试应用程序场景是否可以同时运行指定数量的虚拟用户数;
Hits per Second(每秒点击数)
1. Hits per Second目标:测试服务器每秒点击率(每秒点击数)
(指定每秒点击数目标以及达到这一目标的最小用户数和最大用户数)
2. 虚拟加载策略(Load Behavior)应选择 自动加载(Automatic)
3. Hits per Second只适合Web项目【注意】
Transactions per Second(每秒事务数)
1. Transactions per Second目标:测试服务器每秒处理事务数(指定事务)
(指定每秒完成事务数目标以及达到这一目标的最小用户数和最大用户数)
2. 在VuGen必须插入相应事务
Transaction Response Time(事务响应时间)
1. Transaction Response Time目标:测试在不超过预期事务响应时间(目标)的情况下可以运行多少个用户,
必须指定预期时间、最少用户、最大用户
(例如:需求100个人使用支付软件付款,在3秒钟内完成;预期目标时间为3秒,最少用户80,最多用户180)
Pages per Minute(每分钟页面数)
1. Pages per Minute目标:测试服务器每分钟页面数
(指定每分钟完成页面数目标以及达到这一目标的最小用户数和最大用户数)
2. Pages per Minute只适合Web项目【注意】它的意思是每分种读取的页面个数,它体现的是页面的交换活动的一个指标.
提示
1. 目标场景主要采用内在工具来最大限度完成测试目标,工具很智能,人更智能。
在实际工作场景中使用最多的还是手工场景;
2. 目标场景和手工场景都只是测试场景的搭建模式,场景的运行和监控都是一样;
(手工场景搭建学习完毕,会学习场景的运行和场景的监控)
Manual Scenario 手工场景(重点)
目标
1. 理解手工场景的设计
2. 理解手工场景的启动模式
说明:在实际性能测试过程中,应用最多的还是基于手工设置的场景;
为什么工作中选择手工场景
说明:在手工场景模式内可以最大程度模拟业务场景(虚拟用户的增加、减少、虚拟用户对混合场景的应用);
手工场景的创建
1)启动 选择手工场景
1. 启动:
1). 启动Controller工具
2). Select Scenario Type:Manual Scenario(手工场景)
2. 说明:
1). Use the Percentage Mode...选项:为(百分比模式)暂不用理会
2). 场景添加脚本参考-目标场景添加脚本
2)手工场景界面
说明:
1. 标1:手工场景的基础计划(脚本名称为组名称、虚拟用户数量默认为10);
2. 标2:标1基础计划的默认计划选项(计划方式:场景模式 运行模式:实际计划)
3. 标3:标1计划运行模式(虚拟用户初始化方式、虚拟用户启动加载方式、计划持续运行时间方式、计划完成用户退出方式)
4. 标4:标3计划运行策略直观图
提示:
1. 以上4点为手工场景核心,是手工场景重要组成,接下来我们结合场景来理解学习
案例1 场景需求
说明:
1. 我们知道场景搭建是模拟真实应用场景,而真实场景一般都为混合模式(多个业务)
2. 我们结合LR自带机票网站,模拟真实场景来学习混合场景的搭建
场景:
1. 根据需求分析WebTours订票网站80%用户在使用订票业务,20%用户使用注册业务,统计事务响应时间
2. 混合场景=注册业务(20)+订票业务(80)
需求:
1、登录业务小于5秒
2、订票业务小于10秒
提示:
1. 注册业务:为录制注册脚本,录制脚本时记得插入事务
2. 订票业务:为录制的订票脚本,录制脚本时记得插入事务
案例1 难点分析
1、注册20个账号、使用20个新注册账号订票
2、订票脚本依赖注册脚本(Schedule by:Group)
3、注册脚本参数化 行的选择和更新值方式(Unique+Each iteration+Abort Vuser)
4、购票脚本参数化 行的选择和更新值方式(Sequential + Once)
案例1 需求操作
1. 注册业务、订票业务脚本
2. 创建手工场景,添加(注册业务、订票业务)脚本
3. 修改脚本虚拟用户数(注册20、订票80)-计划设计
4. 设计全局计划运行策略
说明:1、2我们已学过,不在这里阐述;从3开始学习手工场景的设计与搭建
1、修改虚拟用户数
说明:
1. LR默认手工场景虚拟用户为10,我们需要修改虚拟用户数(注册20、订票80)
2. LR手工场景中默认把每个脚本作为一个用户组;
问题:
1. 虚拟用户数不能直接修改
解决 修改虚拟用户数
说明:
1. 在编辑/创建计划内 更换运行模式:Basic schedule就可以直接编辑
2、编辑/创建计划
1. Schedule by-计划方式
2. Run Mode-运行模式
1)Schedule by(计划方式)
说明:
1. Scenario(场景):以场景计划为单位,Controller同时运行所有参与场景的Vuser组;
· (定义的场景运行计划同时会应用于所有Vuser组)
2. Group(组):以Vuser组为单位,参与场景计划的Vuser组,每个组都按其自己的单独计划运行;
(每个Vuser组(脚本)都要设置单独的运行计划策略)
提示:
1. 计划方式一般情况下选择Scenario(场景),这样面对混合场景时,计划运行策略只需要设置一次;
2. Group(组):场景中如果存在业务依赖关系时,必须使用Group组,详情请看Group(组)应用图
Group(组)应用图
依赖关系:两个业务脚本有先后执行之序;
(假设模拟订票业务20并发,前提必须先注册20个用户(注册业务)执行20次,在使用新注册用户去订票);
2)Run mode模式
说明:
1. Real-world schedule(实际计划):场景根据模拟用户实际计划操作来运行【推荐】
(可以通过添加用户组的Action来改变组的虚拟用户策略)
2. Basic schedule(基本计划):和实际计划相同,不同之处,基本计划只能设置虚拟用户在场景一次的启动和停止策略
全局计划运行策略
说明:
1. 计划运行策略是根据Schedule by(计划方式)与Run Mode-模式的组合而产生不同的策略
2. 全局计划策略、计划改变模式改变、都会影响计划图的改变
1)全局计划 场景+真实计划(Scenario + Real - World schedule)
1、Initialize(虚拟用户初始化策略)
1.数字:
1). 1:Controller运行Vuser之前对所有Vuser同时进行初始化
2). 2:Controller在运行指定数目的Vuser之前,根据指定时间间隔对Vuser逐渐进行初始化 (每多少秒初始化多少用户)
3). 3:Controller在每个Vuser开始运行之前对其进行初始化【推荐默认】
2. 提示:
1). Controller运行虚拟用户(线程)之前必须初始化
虚拟用户的初始化就是对线程的初始化,线程创建出来要初始化的
2). 一般采取默认,运行每个Vuser之前对其初始化
2) Start Vuser(虚拟用户启动策略) 【重点】
1. 说明:
1). 1:要启动的虚拟用户数;默认为场景内个Vuser组的Vuser用户总和(系统有个All,选择All就可);
2). 2:同步启动1设定的虚拟用户数;
3). 3:逐渐运行1设定的虚拟用户数;默认15秒启动给定个虚拟用户;【推荐】
3)Duration (持续运行) 【重点】
1. 说明:
1). 1:脚本执行一次,如果有迭代,那么执行到迭代次数完成
2). 2:当前场景运行指定时长 (注意:如果选择此项,那么脚本内如果设置有迭代次数,迭代次数设置将失去作用)
2. 提示:
1). 持续运行策略需要根据场景需求来选择,如:持续压测5分钟,就选第二条
2). 如果脚本有迭代次数,需要迭代完毕就停止场景的话,就选择第一条
4)Stop Vuser(虚拟用户停止策略)
1. 说明:
1). 1:停止的虚拟用户数,默认All(所有用户),或指定用户数;
2). 2:同步停止1设定的用户数
3). 3:逐渐停止1设定的用户数,默认:30秒停止5个虚拟用户;
2)全局计划 用户组+真实计划(Group + Real-world schedule)
1. 说明:
1). Start when group ...... finishes:指定某一用户组(脚本)执行完毕后,执行当前组(脚本);
(脚本有依赖关系时使用,比如:必须先注册在登录)
2). 其他选项参考(Scenario + Real-world schedule)说明
总结
1. Schedule by(计划方式)及区别
2. Run Mode(运行模式)及区别
3. 策略-Initialize作用
4. 策略-Start Vusers作用
5. 策略-Duration作用
6. 策略-Stop Vuser作用
提示
1. (目标、手工)场景的搭建我们学习完毕,LR中场景中的脚本(用户组)必须运行在负载机上;
2. 什么是负载机以及如何添加负载机?
自己实际练习注意的点:
删除之前注册的机票网站用户
抓请求时,记住永远抓第一个请求
注册脚本参数化注意事项:
若按顺序走,需求是五个用户去注册20次,同时五个用户去读取时还能按顺序吗?
提示:按顺序的情况下,默认是一个用户才可以,五个用户就按不了顺序的。
所以这里面的顺序和值更新选择是:唯一加每次迭代。
注册需求:五个用户去注册20次,所以每个用户迭代4次注册脚本。
集合点的设置:重要
集合点策略:policy
注意:在集合点时间范围内启动并集合足够用户
参数化注册脚本
Action()
{
lr_start_transaction("注册-打开首页");
web_url("注册-打开首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
lr_end_transaction("注册-打开首页", LR_AUTO);
lr_start_transaction("注册-注册页面");
web_url("注册-打开注册页面","URL=http://127.0.0.1:1080/WebTours/login.pl?username=&password=&getInfo=true",LAST);
lr_end_transaction("注册-注册页面", LR_AUTO);
lr_start_transaction("注册-注册业务");
lr_rendezvous("集合点-注册");
web_submit_data("注册页面",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=username", "Value={username}", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
"Name=passwordConfirm", "Value=123456", ENDITEM,
"Name=register.x", "Value=31", ENDITEM,
"Name=register.y", "Value=13", ENDITEM,
LAST);
lr_end_transaction("注册-注册业务", LR_AUTO);
return 0;
}
订票脚本
Action()
{
lr_start_transaction("订票-订票总");
lr_start_transaction("订票-打开首页");
// 使用关联函数 关联Session
web_reg_save_param("Session",
"LB=ssion value=",
"RB=>",
LAST);
web_url("打开首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
lr_end_transaction("订票-打开首页", LR_AUTO);
lr_start_transaction("订票-登录");
web_submit_data("登录",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={Session}", ENDITEM,
"Name=username", "Value={username}", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
LAST);
lr_end_transaction("订票-登录", LR_AUTO);
lr_start_transaction("订票-订票业务");
lr_rendezvous("订票-集合点");
web_url("订票-打开航班首页","URL=http://127.0.0.1:1080/WebTours/welcome.pl?page=search",LAST);
web_submit_data("从那到那",
"Action=http://127.0.0.1:1080/WebTours/reservations.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=depart", "Value=Denver", ENDITEM,
"Name=departDate", "Value=06/23/2018", ENDITEM,
"Name=arrive", "Value=Denver", ENDITEM,
"Name=returnDate", "Value=06/24/2018", ENDITEM,
"Name=numPassengers", "Value=1", ENDITEM,
"Name=seatPref", "Value=None", ENDITEM,
"Name=seatType", "Value=Coach", ENDITEM,
"Name=findFlights.x", "Value=22", ENDITEM,
"Name=findFlights.y", "Value=9", ENDITEM,
"Name=.cgifields", "Value=roundtrip", ENDITEM,
"Name=.cgifields", "Value=seatType", ENDITEM,
"Name=.cgifields", "Value=seatPref", ENDITEM,
LAST);
web_submit_data("航班公司",
"Action=http://127.0.0.1:1080/WebTours/reservations.pl",
"Method=POST",
"EncodeAtSign=YES",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=outboundFlight", "Value=000;0;06/23/2018", ENDITEM,
"Name=numPassengers", "Value=1", ENDITEM,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=seatType", "Value=Coach", ENDITEM,
"Name=seatPref", "Value=None", ENDITEM,
"Name=reserveFlights.x", "Value=38", ENDITEM,
"Name=reserveFlights.y", "Value=5", ENDITEM,
LAST);
web_submit_data("web_submit_data",
"Action=http://127.0.0.1:1080/WebTours/reservations.pl",
"Method=POST",
"EncodeAtSign=YES",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=firstName", "Value=Joseph", ENDITEM,
"Name=lastName", "Value=Marshall", ENDITEM,
"Name=address1", "Value=234 Willow Drive", ENDITEM,
"Name=address2", "Value=San Jose/CA/94085", ENDITEM,
"Name=pass1", "Value=Joseph Marshall", ENDITEM,
"Name=creditCard", "Value=", ENDITEM,
"Name=expDate", "Value=", ENDITEM,
"Name=oldCCOption", "Value=", ENDITEM,
"Name=numPassengers", "Value=1", ENDITEM,
"Name=seatType", "Value=Coach", ENDITEM,
"Name=seatPref", "Value=None", ENDITEM,
"Name=outboundFlight", "Value=200;338;06/22/2018", ENDITEM,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=returnFlight", "Value=", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=buyFlights.x", "Value=40", ENDITEM,
"Name=buyFlights.y", "Value=9", ENDITEM,
"Name=.cgifields", "Value=saveCC", ENDITEM,
LAST);
lr_end_transaction("订票-订票业务", LR_AUTO);
web_url("退出登录",
"URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=1",
"TargetFrame=",
"Resource=0",
"Referer=",
LAST);
lr_end_transaction("订票-订票总", LR_AUTO);
return 0;
}