性能测试基础02
性能测试工具-LoadRunner
目标
1. 理解基于VuGen的脚本录制
2. 掌握参数化使用方法
3. 掌握关联的使用方法
4. 掌握检查点的使用方法
5. 掌握事务的使用方法
6. 掌握集合点的应用
LoadRunner介绍
说明:
1). HP LoadRunner是一种工业级标准性能测试负载工具,可以模拟上千万用户实施测试,并在测试时可实时检测
应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈;
2). 支持多协议:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等协议
LoadRunner组成-【非常重要】
组成:
1. Virtual User Generator(VuGen)
2. Controller
3. Analysis
提示:
1. VuGen:脚本生成器-脚本录制、编辑
2. Controller:控制器-设计场景、运行、监控
3. Analysis:测试结果分析
扩展-理解LoadRunner三大工具
说明:为了更好的理解LoadRunner性能测试三大工具作用,我们先回顾下不使用测试工具时,如果进行性能测试...
需求:软件系统支持100人同时登录
实施:
1. 找100个员工及100台电脑,每个员工注册账号OK,环境OK,输入账号、密码完成...鼠标放到登录按钮上;
2. 领导拿个大喇叭,高喊:1...2...3
3. 相关人员统计平均登录时间及登录前、登陆后的服务器CPU、内存等使用情况
LoadRunner执行原理:【重点】
1. VuGen:相当于打开登录页面、输入账号、输入密码、点击登录
2. Controller:相当于100个员工及手拿大喇叭的领导...
3. Analysis:相当与各个统计数据的相关人员
提示
接下来我们就开始分别学习使用这三个工具...
LoadRunner之VuGen操作
目标
1. 掌握VuGen使用流程
一、VuGen介绍
VuGen( Virtual User Generator )录制客户端和服务器之间的相关交互活动,它将
自动生成相关模拟实际情况的API函数。
说明:为了更好的学习VuGen,我们基于LR11自带的订票系统为案例练习使用VuGen;
提示:
1. LR录制脚本功能由于兼容性问题,非常不好使,我们平时在工作中也不使用录制方式,在这里我们了解下
它的录制过程;
2. 由于兼容性和录制多余操作,一般手写脚本,这才厉害且没有兼容性的问题;
案例一
需求:
1. 录制机票网站的登录、退出脚本
使用:
1. 启动网站服务程序
2. 访问地址:http://127.0.0.1:1080/WebTours/
3. 登录账户:用户名:jojo 密码:bean
启动服务程序
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215824837-2110643615.png)
位置:开始菜单->HP LoadRunner->Samples->Web->Start Web Server
提示:WebTours项目默认使用1080端口,如果启动失败,看是否端口被占用或者是否有权限;
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215825247-380948759.png)
启动成功界面
案例1-实施步骤分析
1. 启动VuGen
2. 创建脚本
3. 选择录制协议 Web(HTTP/HTML)【重要】
4. 录制设置
5. 脚本录制
6. 运行脚本
1、启动VuGen
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215825579-1428590600.png)
开始菜单->HP LoadRunner->LoadRunner
注意:一定要以管理员身份运行才可以,可以用管理员运行cmd,再用cmd打开LoadRunner,这样就行了
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215826025-573703693.png)
点击:Create/Edit Script
2、创建脚本
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215826390-673009724.png)
1. 菜单栏(File)-》New 快捷键(Ctrl+n)
2. 常用工具栏-》第一个图标(new Ctrl+n)
3. Start Page:点击快捷创建脚本图标(new Script)【推荐】
3、选择协议
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215826754-1566610963.png)
1. New Single Protocol Script:单一协议
2. Popular Protocols:主流协议
3. Web(HTTP/HTML):HTTP协议【选择】
4、录制设置
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215827095-449507072.png)
1. Application type:Internet Application【选择】
(Internet Application:HTTP协议使用)
2. Programe to record:选择浏览器
1). IE:版本8;(提示:64位操作系统选择32位ie;)【选择】
2). 火狐浏览器35以下;
3. URL Address:http://127.0.0.1:1080/WebTours/(项目网址)
4. Working directory:工作目录 默认即可
5. Record into Action:录制脚本存放的计划名
1). vuser_init:首先执行 迭代运行时候,只会运行一次
2). Action:可迭代运行、可新增【选择】
3). vuser_end:最后执行 迭代运行时候,只会运行一次
6. 点击OK-开始录制
5、脚本录制
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215827409-1051135853.png)
1. Recording..events:录制事件
2. 用户名:jojo 密码:bean
3. 点击Login
4. 点击Sign Off 退出登录
5. 停止录制
6. 生成脚本
退出登录
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215827778-325107841.png)
停止录制
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215828139-1086335481.png)
生成脚本
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215828565-1063350690.png)
6、运行脚本
既然已经录制好了脚本了,为什么还要运行脚本呢?
说明:验证录制脚本是否能正常运行;
如何运行脚本
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215828924-1177215682.png)
1. 点击Run按钮
2. F5键直接回放
怎么查看运行脚本结果?
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215829257-2135721954.png)
菜单(View)->Test Results...
VuGen-扩展(录制、回放)
目标
1. 了解录制其他模式
2. 了解Run-Seting
一、录制选项-扩展
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215829592-1841889259.png)
在录制设置的时候,有一个option选项按钮,它有什么作用呢?
录制设置option选项
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215829903-985020911.png)
1. HTML-based script: 所有请求放到一个函数内
2. URL-based script: 每个请求放到一个函数
提示:
1). 基于浏览器的应用程序推荐使用HTML-based Script
2). 不是基于浏览器的应用程序推荐使用URL-based Script。
4). 基于浏览器的应用程序中使用了HTTPS 安全协议,使用URL-based 方式录制
备注:为了学习效果,在这里我们先介绍重点功能,其他功能需要使用的时候我们在进行讲解
HTML Advance选项
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215830268-647479890.png)
1. web_submit_form: 依赖上下文才能提交。
2. web_submit_data: 不依赖上下文,每个函数都指定了具体的url地址,可以直接提交成功;【推荐】
提示:没有特殊的场景需求,推荐使用:web_submit_data
二、运行设置
1. Run-time Settings
(菜单-Vuser->Run-time Settings) 快捷键F4
Run-time Settings
1. Run Logic 脚本运行迭代次数
2. Think Time 运行时思考时间处理方式
说明:为了更好的理解迭代与Think Time设置,我们在这里先学习2个常用的函数,方便我们快速运行、查看执行效果;
常用函数
1. lr_output_message()
2. lr_think_time()
1) 函数 lr_output_message()
说明:输出到运行日志 如:lr_output_message("hello Action")
参数: 要输出的文本信息
2)函数 lr_think_time()
说明:思考时间 最大可能模仿用户真实操作 如:lr_think_time(4)
参数:停顿多少秒
练习脚本
Action()
{
lr_output_message("Action被执行");
lr_think_time(6)
return 0;
}
Action2()
{
lr_output_message("Action2被执行");
return 0;
}
提示:
1. C语言语法:必须以分号(;)作为行结束标记
2. return 0:结束本次迭代,进入下一迭代;
RunLogin迭代次数
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215830682-22799607.png)
1. 迭代就是脚本要执行的次数
2. Init与End迭代次数不生效,只会运行一次
Think Time思考时间
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215831019-1069176149.png)
1. Ignore think time 默认(忽略思考时间)
2. Replay think time (播放思考时间)
1). As recorded (录制多少秒,就等待多少秒)
2). MuItiply recorded think time by (录制时间的倍数)
3). Use random percentage of recorded think time
( Min(录制时间的最小百分比) Max(录制时间的最大百分比))
4). Limit think time to( 限制最高时间)
VuGen手动编写脚本
目标
1. 掌握C语言注释
2. 掌握基于LR手动编辑脚本方法
注释:
说明:首先科普下C语言中的注释;
1. // :单行注释
如://登录
2. /**/ :多行注释
如:/*
多行
注释
*/
为什么要手动编写脚本
1. 避免LR由于兼容性导致录制异常或失败;
2. 手写脚本无冗余代码,更有利于脚本的增强(插入事务、参数化)与维护
手动编写脚本使用编程语言
1. JAVA
2. C语言 【推荐】
提示:
1. Loadrunner中虽然默认是使用C语言录制/编写脚本,我们无需专业去学C语言;
2. 只需注意下基础语法和掌握LR中常用的几个请求的函数的用法就可以编写常用的脚本
问题:需要掌握LR中那几个函数?
脚本请求函数
1. web_url() GET请求 【掌握】
2. web_submit_data() POST请求 【掌握】
3. web_custom_request() 定制请求(GET\POST\PUT\DEL) 【了解】
提示:掌握 web_url、web_submit_data两个就好;
Web_url()函数重点
说明:GET请求时使用;
语法:web_url("request name","URL=http://***",LAST);
1). request name:标记请求名称,比如:首页
2). URL=http://***:URL=为固定格式;http://***为GET请求地址
3). LAST结束标志;
案例:使用web_url函数打开机票网站首页
分析:看它是否是Get请求的方式,用F12可以查看到它是Get请求的,故可用此函数
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215831420-1388781074.png)
脚本:
Action()
{
// 打开WebTours首页
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
return 0;
}
点击运行F5,之后点击View-->Test Results,来到结果视图后在脚本上鼠标右键Expand All即可
Web_submit_data()函数【重点】
说明:POST请求专用;
语法:web_submit_data( StepName, Action=http://***, <List of Attributes>, ITEMDATA,
<List of data>, LAST );
1). StepName:标记请求名称, 比如:登录
2). Action=http://***:Action=固定格式;http://***:提交地址
3). List of Attributes:其他属性 如:"Method=POST"
4). List of data:其他参数 如:"username=jojo"
5). LAST:结束符
提示:
1. POST提交参数比较多,我们不用一个个记,使用插入函数方法,在函数对话框内输入;
2. 录制HTML页面时,Mode推荐使用HTML;
操作:
空白处鼠标右键
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215831855-2084346748.png)
找到Web_submit_data()函数
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215832196-1273784231.png)
点击ok,进入下一步
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215832597-196138189.png)
接下来,要配置登录的数据了
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215833007-1040115476.png)
点击确定,此时脚本:
打开首页并登录的脚本如下
Action()
{
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value=129439.97399757zzfiAzipzzcfDQQtiptVVQHf", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=39", ENDITEM,
"Name=login.y", "Value=10", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
return 0;
}
点击运行脚本,查看结果如下,并不是预期的欢迎页面,这是因为Session的问题,将脚本的Session换成动态获取即可:
Action()
{
# 解决session问题
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 模拟登录,抓包分析得出是Post请求
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=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
return 0;
}
运行时,即可得出登录结果,bingo正确
web_custom_request()函数【了解】
说明:自定义请求方法(GET/POST/PUT/DELETE)
语法:web_custom_request( RequestName, <List of Attributes>,LAST );
1). RequestName:请求名称
2). List of Attributes:属性列表,如:"Method=POST"
3). LAST:结束符
提示:以后在项目里涉及其他请求方法时,有用;
VuGen-参数化
目标
1. 理解参数化使用场景
2. 掌握参数化使用方式
什么是参数化
概念:根据需求动态的获取数据的过程
为什么要参数化
1. 减少重复代码
2. 数据和代码进行分离,方便维护
需求1
说明:由于虚拟机运行速度原因,我们使用lr_output_message()函数练习学习使用参数化
要求:
1. 输出 我要去北京;我要去上海;我要去广州;我要去深圳;
参数化操作
打开参数化菜单
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215833412-2066130437.png)
选中要参数化的文本->鼠标右键->Replace with a Parameter
或者
菜单【Insert】>【New Parameter...】
Replace with a Parameter 打开的窗口
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215833707-88881462.png)
1. Parameter name:参数化引用名称(参数化时使用)
2. Parameter type:File 【推荐-File】
3. Properties:属性-点击此按钮,可直接设置参数化引用名称对应的值;【点击】
提示:
1). 点击OK;参数化引用名称具体的值,需要再次设置;
Properties 设置面板
![](https://img2020.cnblogs.com/blog/2143358/202010/2143358-20201009215834128-452482095.png)
若指定文件没有,就点击create table选项,就会创建你要的文件名和类型。
1. Parameter type: 参数类型 File 【重点】
2. File:参数保存的文件类型及位置,一般为txt;【推荐】
3. Add Row:添加行,在当前表格编辑数据;【可选】
4. Edit with Notepad:在记事本内编辑数据;【推荐】
5. Select next row:运行或迭代时对行的选择方式
1).
6. Update value on:运行或迭代时对值的选取方式
提示:
1). Select next row与Update value on为组合关系,不同组合效果不同,我们单独来学习
需求1 解决方案
1. 创建指定路径及txt文本格式 如:C:\lr11\scripts\city.txt
2. 使用Edit with Notepad 编辑数据:北京、上海、广州、深圳
3. 编写脚本
4. 迭代次数 4
问题:如何把设置好的参数读取打印出来?
为了更好的学习使用参数化,我们必须先了解个函数
函数:lr_eval_string()
为什么要了解lr_eval_string()函数?
1. lr_output_message(“str”):函数为把str字符串输出到日志,它自身并不能解析读取参数。
2. 为了日志记录详细我们必须学习个能读取参数,再通过lr_output_message()函数来输出到日志
函数lr_eval_string()
功能:读取变量的值,并以Char类型返回
示例:
lr_eval_string("{parameter}")
提示:
1). 参数名称使用花括号{}包括
2). 参数使用双引号包括
需求1、代码示例
1. 代码:
Action()
{
// 打印城市
lr_output_message("我要去 %s",lr_eval_string("{city}"));
return 0;
}
Select next row 与 Update value on
Select next row
说明:读取参数文件行的方式
方式:
1. Sequential:顺序,按照行的顺序读取数据,如果迭代次数大于行数,再次从第一行开始读取
2. Random:随机,随机读取行
3. Unique:唯一,每次迭代读取唯一行,不重复;如果行数读完,立即停止行迭代;
Update value on
说明:参数值更新的方式
方式:
1. Each iteration:每次行迭代以后更新
2. Each occurrence:每次出现参数时更新
3. Once:每出现一个虚拟用户(线程)更新一次
组合
1. 行迭代顺序+值每次迭代更新值 Sequential + Each iteration
2. 行迭代顺序+值每次参数出现更新值 Sequential + Each occurrence
3. 行迭代顺序+值更新一次(单用户,每出现一个虚拟用户更新一次) Sequential + Once
说明:
1. 组合我们在这里就不穷举了,以行的顺序配合值的3种更新方式做演示
2. 因为组合内含occurrence,所以必须要两个Action,我们新增两个(Action、Action2)两个代码相同
应用:在性能测试基础04里有注册脚本和订票脚本,注册脚本要注册20次,采用的方法时5个用户,每个用户迭代四次,一共有20条数据,
若想在注册脚本中可以将这些数据无误读出来,组合方式是:Unipue+Each iteration.
订票脚本有20个用户,每个用户执行脚本一次,因此若想将这些数据按顺序参数化读取并使用,采用的组合方式是:Sequential+Once
代码
Action()
{
lr_output_message("我要去%s",lr_eval_string("{NewParam}"));
return 0;
}
Action2()
{
lr_output_message("我要去%s",lr_eval_string("{NewParam}"));
return 0;
}
Sequential + Each iteration
说明:行为顺序,值为迭代更新一次;
预期:
1. 第一次迭代:Action:北京;Action2:北京
2. 第二次迭代:Action:上海;Action2:上海
3. 第三次迭代:Action:广州;Action2:广州
4. 第四次迭代:Action:深圳;Action2:深圳
Sequential + Each occurrence
说明:行为顺序,值为出现一次更新一次
预期:
1. 第一次迭代:Action:北京;Action2:上海
2. 第二次迭代:Action:广州;Action2:深圳
3. 第三次迭代:Action:北京;Action2:上海
4. 第四次迭代:Action:广州;Action2:深圳
Sequential + Once
说明:行为顺序,值为单用户只更新一次
预期:
1. 第一次迭代:Action:北京;Action2:北京
2. 第二次迭代:Action:北京;Action2:北京
3. 第三次迭代:Action:北京;Action2:北京
4. 第四次迭代:Action:北京;Action2:北京
扩展 批量获取参数时,如果保证参数不重复?
思路:添加时间戳
说明:web_save_timestamp_param("time_stamp",LAST) 为时间戳函数,返回:1970到现在的毫秒数;
(time_stamp:参数为获取值后保存的参数名称,被引用时使用)
示例:
Action()
{
web_save_timestamp_param("time_stamp",LAST);
lr_output_message("我要去%s",lr_eval_string("{NewParam}_{time_stamp}"));
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)