理解LoadRunner,基于此工具进行后端性能测试的详细过程(下)
5、录制并增强虚拟用户脚本
从整体角度看,用LoadRunner 开发虚拟用户脚本主要包括下面四步骤:
识别测试应用使用的协议
录制脚本
完善录制得到的脚本
验证脚本的正确性
识别被测应用使用的协议
如果明确知道了被测系统所采用的协议,可以跳过这一步。如果还不知道可以使用Virtual User Generator 模块自带的 Protocol Advisor 识别被测应用使用的协议,具体的操作方法:
在 Virtual User Generator 中依次点击 File、Protocol、AdvisorAnalyze、Application,展开这些菜单
在打开的界面上按要求填写被测应用的信息
Protocol Advisor 会自动运行被测系统。如果是网页应用,就会打开浏览器
在页面上执行典型业务操作,完成业务操作后点击 “Stop Analyzing” 按钮停止录制
Protocol Advisor 会根据刚才录制的内容自动分析被测应用使用的协议,并给出最终的建议
接下来,就可以使用 Protocol Advisor 建议的录制协议开始脚本录制工作了。如图就是 Protocol Advisor 给出的建议录制协议界面。
1)录制脚本
基本原理是,通过GUI 界面对被测系统进行业务操作,Virtual User Generator 模块在后台捕获 GUI 操作所触发的客户端与服务器端的所有交互,并生产基于 C 语言的虚拟用户脚本文件。
即录制脚本的过程需要通过GUI 实际执行业务操作,所以在开始录制脚本前,可以先多次演练需要这些 GUI 操作步骤,并明确知道哪些操作步骤会对服务器端发起请求。
要知道哪些操作步骤会对服务器发起请求的原因是,要将这些操作步骤在虚拟用户脚本中封装成“事务”(Transaction)。封装为“事务”的目的是统计响应时间,因为 LoadRunner 中的响应时间都是以“事务”为单位的。
具体的录制步骤包括下面三步:
选择 Create/Edit Scripts 进入 Virtual User Generator 创建脚本的协议选择界面。
选择正确的协议后进入 Start Recording 界面,选择需要录制的应用类型,填写应用的详细信息。如果是 Web 应用,Application type 就应该选择Internet Application,然后选择浏览器并填写这个 Web 应用的 URL,完成后自动打开浏览器。
在该浏览器中执行业务操作,Virtual User Generator 模块会记录所有的业务操作,并生成脚本。
由于LoadRunner 脚本的可读性并不好,在录制完的脚本中添加事务定义的难度大。所以在录制脚本的过程中,最好直接对发起后端调用的操作添加事务定义,而不要脚本生成后添加。
在录制过程中,直接添加事务操作也很简单,主要包括如下三步:
在开始执行 GUI 操作前,点击下图的“事务开始”并填写事务名称
执行 GUI 操作
操作完成后,点击下图的“事务结束”
这样刚才执行GUI 操作的脚本就会被 lr_start_transaction(“事务名称”) 和 lr_end_transaction(“事务名称”,LR_AUTO) 包围起来,也就完成了添加事务的定义。
2)完善录制得到的脚本
Virtual User Generator 模块录制的脚本不能直接使用,我们还需要对录制的脚本做以下处理:
两个事务之间加入思考时间(Think Time)
对界面输入的数据参数化(Parameterization)操作
完成脚本的关联(Correlation)操作
加入检查点(Check Point)
这4 步处理操作是虚拟用户脚本开发中最关键的地方,不仅需要知道为什么要进行这些处理,更要能够完成这些处理,否则录制的脚本无法成功回放。
第一,在两个事务之间加入思考时间
思考时间是用户在实际使用系统时,并不会连续不断地向后端服务器发起请求,在两次发起请求之间往往会有一个时间的间隔,这个时间间隔主要来自于两个方面:
用户操作的人为等待时间,因为用户不可能像机器人那样快速地执行操作
用户可能需要先在页面上填写很多信息后之后,才能提交操作,那么填写这些信息就需要花费一定的时间
为了让虚拟用户脚本能够更真实地模拟实际用户的行为,就需要在两个事务之间加入一定的等待时间。即 LoadRunner 中的思考时间。
只需直接调用LoadRunner 提供的 lr_think_time() 函数,就可以在两个事务之间加入思考时间。但是,这个思考时间到底设置为多少,并没有那么容易知道。思考时间往往会涉及多方面的因素,严格计算的话会非常复杂。
在实际项目中,可先粗略估计一个值(比如15 s),然后在实际执行负载场景的过程中,再根据系统吞吐量调整。
后续调整思考时间时,无需逐行修改虚拟用户脚本代码,可以在Run-time Settings(运行时设置)中很方便地完成。如图,Run-time Settings 中支持多种方式调整思考时间。
第二,对界面输入的数据做参数化操作
假设,录制的虚拟用户脚本完成的是用户登录操作,那么由于脚本回放时需要支持多用户的并发,所以必须要把脚本中的用户名和密码独立出来,放入专门的数据文件中,然后在这个文件中提供所有可能被用到的用户名和密码。
以下是参数化配置的界面截图,LoadRunner 支持的参数化的数据源很丰富,既可以是 excel 文件,也可以是数据库中的表等。
凡参数文件中使用的测试数据,都需要在执行性能测试前在被测系统中准备好。以用户登录的脚本为例,假定你的参数文件中提供了5000 个用于并发执行的用户信息,那么这 5000 个用户必须是已经实际存在于系统中的,这就要求你要在开始测试前事先准备好这 5000 个用户。
所以,参数化操作其实由两部分组成:
性能测试脚本和测试数据的分离
事先建立性能测试的数据
第三,完成脚本的关联操作
关联操作直接关系到脚本是否可以回放成功。主要作用是取出前序调用返回结果中的某些动态值,传递给后续的调用。
举个例子:
假设,每次客户端连接服务器端时,服务器端都会用当前的时间戳(Time Stamp)计算 CheckSum,然后将 Time Stamp 和 CheckSum 返回给客户端。然后,客户端就把 Time Stamp + CheckSum 的组合作为唯一标识客户端的 Session ID。录制脚本时,录制得到的一定是硬编码(hardcode)的 Time Stamp 值和 CheckSum 值。
下图是交互过程,录制得到Time Stamp 的值是 TS,而 CheckSum 的值是 CS。

采用 Time Stamp + CheckSum 的组合作为 Session ID 的方式,在回放这个脚本的时候就有问题了。因为回放时,这段硬编码已经有了新的 Time Stamp 值和 CheckSum 值,并且显然与之前的值不同,所以服务器无法完成 Session ID 的验证,也就导致了脚本回放失败。
解决方法就是,在脚本回放的过程中,实时抓取Time Stamp 值和 CheckSum 值,然后用实时抓取到的值替换后续需要使用这两个值的地方。这个过程就是“关联”。
如下图,关联就是解析服务器端的返回结果,抓取新的Time Stamp 值和 CheckSum 值,然后后续的操作都使用新抓取的值,这样脚本就能回放成功了

理解了关联操作,在脚本中处理关联就比较简单了,LoadRunner 提供了功能强大的关联函数 web_reg_save_param()。这个关联函数支持多种动态值的获取方式,用得最多的是基于“前序字符串匹配”加上“后续字符串匹配”的方式。其中,字符串匹配,支持正则表达式。
看个具体的例子:
假设,服务器端返回的结果是:
“LB=name=timestamp value=8888.LB=name=CheckSum”,
那么为了能够获取到“8888”这个动态值,我们就可以用“前序字符串 =LB=name=timestamp value=”和“后续字符 =.LB=name=CheckSum”来“框出” 8888”这个动态值。
另外,需要特别注意的是web_reg_save_param() 函数是注册型函数,必须放在获取动态值所属的请求前面,相当于先声明,后调用。更多的关联函数用法,你可以参考 LoadRunner 官方文档.
第四,加入检查点
检查点,类似于功能测试中的断言。但是,性能测试脚本,不像功能测试脚本那样需要加入很多的断言,往往只在一些关键步骤后加入很少量的检查点即可。这些检查点的主要作用是,保证脚本按照原本设计的路径执行。
最常用的检查点函数是web_reg_find(),作用是通过指定左右边界的方式“在页面中查找相应的内容”。这里需要注意的是,这个函数也是注册型函数,即需要放在所检查的页面之前,否则会检查失败。更多的检查点函数以及用法也可参考 LoadRunner 官方文档
3)验证脚本的正确性
可以以下顺序检查脚本的准确性:
以单用户的方式,在有思考时间的情况下执行脚本,确保脚本能够顺利执行,并且验证脚本行为以及执行结果是否正确;
以单用户的方式,在思考时间为零的情况下执行脚本,确保脚本能够顺利执行,并且验证脚本行为以及执行结果是否正确;
以并发用户的方式,在有思考时间的情况下执行脚本,确保脚本能够顺利执行,并且验证脚本行为以及执行结果是否正确;
以并发用户的方式,在思考时间为零的情况下执行脚本,确保脚本能够顺利执行,并且验证脚本行为以及执行结果是否正确;
上述四个测试全部通过,就可以拿到虚拟用户脚本。
6、创建并定义性能测试场景
就是在LoadRunner Controller 中设置性能测试场景。目的是要描述性能测试过程中所有与测试负载以及监控相关的内容。通常来讲,性能测试场景设计主要会涉及以下部分:
并发用户数是多少;
测试刚开始时,以什么样的速率来添加并发用户?比如,每秒增加 5 个并发用户;
达到最大并发用户数后持续多长时间;
测试结束时,以什么样的速率来减少并发用户?比如,每秒减少 5 个并发用户;
需要包含哪些业务操作,各个业务操作的占比是多少?比如,10% 的用户在做登录操作,70% 的用户在做查询操作,其他 20% 的用户在做订单操作;
一轮虚拟用户脚本执行结束后,需要等待多长时间开始下一次执行;
同一虚拟用户脚本中,各个操作之间的等待时间是多少;
需要监控哪些被测服务器的哪些指标;
脚本出错时的处理方式是什么?比如,错误率达到 10% 时,自动停止该脚本;
需要使用多少台压力产生器;
7、执行性能测试场景
一般是在LoadRunner Controller 中完成。你可以通过 Controller 发起测试、停止测试、调整性能测试场景的各种参数,还可以监控测试的执行过程
8、分析测试报告
执行完性能测试后,LoadRunner 会根据自己的标准并结合性能测试场景中定义的系统监控器指标,生成完整的测试报告。在 Analysis 中,不仅可以以图形化的方式显示单个指标,也可以将多个指标关联在一起进行比较分析。
下图展示了使用LoadRunner Analysis 展示事务平均响应时间的界面,我们可以看到图片右下角各个事务的最小响应时间、最大响应时间和平均响应时间。

文章来源:网络 版权归原作者所有
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理
相关文章:
理解LoadRunner,基于此工具进行后端性能测试的详细过程(下)
5、录制并增强虚拟用户脚本 从整体角度看,用LoadRunner 开发虚拟用户脚本主要包括下面四步骤: 识别测试应用使用的协议 录制脚本 完善录制得到的脚本 验证脚本的正确性 识别被测应用使用的协议 如果明确知道了被测系统所采用的协议,可…...
K8s上的监控系统(Grafana)使用和理解说明
Grafana (集成Prometheus On K8s集成)主要步骤说明 客户端指标收集 —— K8s 集群资源等 —— Prometheus 监控数据收集 —— Grafana —— 通过PromQL 进行数据查询 —— 预警告警等通知 Kubernetes集群资源:这包括了CPU、内存、磁盘、网络等各种类型的资源。这些资…...
【netty从入门到放弃】netty转发tcp数据到多客户端
目录 创建数据库表xml实体类启动类线程类客户端代码handlecontroller类缓存tcp链接 接到一个需求,需要实现转发通讯模块tcp数据其他的服务器,也就是转发tcp数据到多客户端 任务拆解: 首先需要建立多客户端,每个客户端有一个独立的clientId和…...
Linux | gdb的基本使用
目录 前言 一、调试文件的生成 二、调试指令 1、选择调试文件 2、查看代码 3、运行代码 4、断点 5、打印与常显示 6、其他 总结 前言 前面我们学习了如何使用gcc/g来进行对代码进行编译,本章我们将使用gdb来对代码进行调试,学习本章的前提是有…...
C++之this指针
前言 C中对象模型和this指针是面向对象编程中的重要概念。对象模型描述了对象在内存中的布局和行为,包括成员变量、成员函数的存储方式和访问权限。this指针是一个隐含的指针,指向当前对象的地址,用于在成员函数中引用当前对象的成员变量和成…...
大模型,重构自动驾驶
文|刘俊宏 编|王一粟 大模型如何重构自动驾驶?答案已经逐渐露出水面。 “在大数据、大模型为特征,以数据驱动为开发模式的自动驾驶3.0时代,自动驾驶大模型将在车端、云端上实现一个统一的端到端的平台管理。”毫末智…...
Jmeter执行接口自动化测试-如何初始化清空旧数据
需求分析: 每次执行完自动化测试,我们不会执行删除接口把数据删除,而需要留着手工测试,此时会导致下次执行测试有旧数据我们手工可能也会新增数据,导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通过…...
dashboard报错 错误:无法获取网络列表、dashboard报错 错误:无法获取云主机列表 解决流程
文章目录 错误说明dashboard上报错底层命令报错查看日志message日志httpd报错日志错误日志分析开始解决测试底层命令dashboard错误说明 dashboard上报错 首先,dashboard上无论是管理员还是其他项目,均无法获取云主机和网络信息,具体报错如下...
C语言中的3种注释方法
C语言中的3种注释方法 2021年8月28日星期六席锦 在用C语言编程时,常用的注释方式有如下几种: (1)单行注释 // … (2)多行注释 /* … */ (3)条件编译注释 #if 0…#endif (1)(2)在入门教程中比较常见。 对于(1) 【单行注释 // …】,注释只能显示…...
20款VS Code实用插件推荐
前言: VS Code是一个轻量级但功能强大的源代码编辑器,轻量级指的是下载下来的VS Code其实就是一个简单的编辑器,强大指的是支持多种语言的环境插件拓展,也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主…...
攻防世界web篇-robots
打开网址后,发现是一个空白页面的网页 但是,这个题目是robots,所以就联想到robots.txt这个目录,于是我就试了一下 注意:这里有个php的文件,这个应该就是一个目录文件 当输入后,直接回车&#…...
6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)
在过去的几个月里,我广泛探索了 ChatGPT 的所有可用插件。在此期间,我发现了一些令人惊叹的插件,它们改进了我使用 ChatGPT 的方式,但现在,我将透露一些您需要了解的内容。 借助 Chrome 扩展程序,所有 Chat…...
centos 7.9 安装sshpass
1.作用 sshpass是一个用于非交互式SSH密码验证的实用程序。它可以用于自动输入密码以进行SSH登录,从而简化了自动化脚本和批处理作业中的SSH连接过程。 sshpass命令可以与ssh命令一起使用,通过在命令行中提供密码参数来执行远程命令。以下是一个示例命…...
CompletableFuture多任务异步,获取返回值,汇总结果
线程池异步的基础知识 详情见:https://blog.csdn.net/sinat_32502451/article/details/133039624 线程池执行多任务,获取返回值 线程池的 submit()方法,可以提交任务,并返回 Future接口。 而 future.get(),可以获取…...
Linux上Qt和Opencv人脸识别项目学习路线(嵌入式/C++)
本文将介绍Linux人脸识别项目的开发流程, 只作简略介绍所需知识点及大致流程。 注:若需详细教程请联系作者(见文末)。 一、基本开发环境搭建 1.1 安装虚拟机Ubuntu 虚拟机采用的是VMware,需要下载VMware安装包、ubuntu系统镜像…...
spring 源码阅读之@Configuration解析
Configuration解析 Configuration注解用于标识一个类是配置类,用于声明和组织Bean定义,首先Configuration本身也是一个Component,在其注解定义上标有Component Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Co…...
Java Web 33道面试题汇总
更多面试合集在:https://javaxiaobear.cn 1、http 的长连接和短连接? HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名…...
设计模式记录
设计模式 抽象工厂模式单例模式要实现一个单例,需要关注的点有下面几个: 抽象工厂模式 PHP工厂模式是一种可扩展、可维护和可重复使用的方法,旨在提供通用接口,用于创建对象。工厂模式的主要组成部分包括抽象工厂、具体工厂、抽象产品和具体产…...
Java设计模式之亨元模式(Flyweight Pattern)
亨元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和提高性能。该模式适用于需要创建大量相似对象的情况,其中许多对象具有相同的状态。通过共享相同的状态,亨元模式可以减少…...
正点原子嵌入式linux驱动开发——Linux中断
不管是单片机裸机实验还是Linux下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断需要做一大堆的工作,比如配置寄存器,使能IRQ等等。但是Linux内核提供了完善的中断框架,只需要申请中断,然后注册中断处…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
