百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

LoadRunner v12测试案例--性能分析

zhezhongyun 2025-02-21 16:20 35 浏览

软件测试已逐渐成为软件开发过程中的必不可少的环节,随着功能测试的必要性被普遍认同,自动化测试以及性能测试也逐渐崭露头角。性能测试是指在一定的负载情况下,系统的响应时间等特性是否满足特定的性能需求。

目前常用于功能测试的工具有:

  1. HP LoadRunner(简称LR,商用软件):是一款适用于各种体系架构的自动化性能测试工具。LR的测试对象是整个企业的系统,通过模拟实际用户的操作行为和实时性能监控,来帮助你更快地查找和发现性能瓶颈。
  2. IBM Rational Performance Tester(简称RPT,商业软件):也是一款性能测试工具,适用于基于 Web 的应用程序的性能和可靠性测试。RPT将易用性与深入分析功能相结合,从而简化了测试创建、负载生成和数据收集,以帮助确保应用程序具有支持数以千计并发用户并稳定运行的性能。
  3. Apache JMeter(开源软件):基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器等。

相比于其他测试工具,LoadRunner能支持更广泛的协议和技术,能测试各种IT基础架构,为用户的特殊环境提供特殊的解决方案。本文将以当前最新的LoadRunner12社区版来进行阐述。相比于之前版本,LoadRunner12社区版主要有以下新特性:

  • 支持50个免费虚拟用户。
  • 支持基于云平台的负载生成器。
  • 支持HTML5及SPDY协议的脚本录制。
  • 支持IE11、Chrome以及Firefox浏览器,支持Win8.1及Win2012 Server操作系统。

本文将从如下几个方面阐述LoadRunner的优势

  • LoadRunner组件
  • LoadRunner工作原理
  • 基于LoadRunner的测试案例

LoadRunner组件

LoadRunner主要由以下4个部分组成:

  1. 脚本生成器(Virtual User Generator)简称VuGen,提供了基于录制的可视化图形开发环境,可以方便简洁地生成用于负载的性能测试脚本。
  2. 负载生成器(Load Generator)简称LG,负责将VuGen脚本复制成大量虚拟用户对系统形成负载。
  3. 负载调度监控器(Controller) 负责对整个负载的过程进行场景设置,指定负载的运行方式和周期,同时提供了系统监控的功能。
  4. 数据收集分析器(Analysis) 通过Analysis我们可以对负载生成后的相关数据进行整理分析,从而定位性能瓶颈。

LoadRunner工作原理

首先通过VuGen来录制模拟用户行为的脚本;然后根据性能测试目标,在Controller中设计场景,指定负载生成的方式(如LG使用数,并发用户数,执行时长等);接着执行场景并监控被负载服务器的性能指标;待场景执行完毕,调用Analysis来对生成的数据进行分析,最后得出性能测试报告。

基于LoadRunner的测试案例

使用LoadRunner进行性能测试,大体可分为3个步骤:

1.用户行为模拟

性能测试的第一步也是最重要的一步,就是生成虚拟用户脚本(Vuser Script)。VuGen是基于录制-回放的工具,提供了整个脚本的开发环境。当你在应用程序中执行业务流程时,VuGen会将你的操作录制下来,自动转换成脚本,作为用户行为的模拟。

多数情况下,我们会在录制生成的脚本上根据需求进行修改。录制流程主要包括以下协议选择、录制选项设置、开始录制、插入命令、停止录制。对一般B/S架构的Web应用,选择Web - HTTP/HTML协议就可以了。

如果不能确定目标系统使用了哪些协议,可以使用Protocol Advisor 来进行协议分析。

选择协议之后,进行录制选项设置,再点击红色按钮开始录制脚本。

可以看到,Vuser Script脚本由以下三部分组成:

vuser_init: 虚拟用户的初始化函数,一般将用户初始化的操作放在这里,如登录操作,只会运行一次。

Action: 虚拟用户要做的业务操作,也就是测试内容的主体。可以迭代多次。

vuser_end: 与vuser_init相对应的收尾工作,如退出登录操作,只会运行一次。

开始录制脚本后,可以在recording界面进行执行插入事务、插入集合点、插入注释以及结束录制等命令。

完成录制后,脚本通常会包含web_url等函数。Vuser Script脚本中常用函数有:

web_add_cookie:负责为Vuser脚本添加一个cookie信息。

web_url:可以模拟用户的HTTP Get请求。

web_submit_form:基于页面表单模拟用户的HTTP Post请求。该函数会自动检测在当前页面上是否存在form表单,然后将表单中数据进行传送。

web_submit_data:无需页面form支持就可以模拟用户的HTTP Post请求。

web_custom_request:可以模拟用户的HTTP Get以及Post请求。

紧接着,点击replay按钮进行回放验证。我们可以把服务器返回的响应内容保存为参数,在请求时使用该参数,可实现动态数据。

如常见的系统登录功能,在登录后服务器会返回SeesionID,登录后的操作都需要提交该SessionID以确认身份。使用Vugen录制脚本时,将会记录服务器返回的SessionID并在下一个请求中发给服务器。

事务函数可以标记完成该业务所需要的操作内容。通过在业务操作开始前添加一个事务开始的计数器,在业务操作结束后添加一个事务结束的计数器,VuGen可以自动计算出函数间的时间差,即事务响应时间。

添加事务主要涉及以下2个函数:

事务开始函数:lr_start_transaction(“事务名”)

事务结束函数:lr_end_transaction(“事务名”,LR_AUTO)

另外事务还支持事务嵌套:

lr_start_sub_transaction(“子事务名”,“父事务名”)

lr_end_sub_transaction(“子事务名”,“父事务名”)

一般地,录制得到的脚本都会包含思考时间。思考时间是LoadRunner提供的用于模拟用户等待的方式。在性能测试时只有启用思考时间,才能真正地按照用户的操作速度来完成请求,得到真实情况下的负载数据;否则则是全负载下的理论峰值数据。

思考时间函数:lr_think_time

集合点函数能让虚拟用户集合在同一时间点上来进行操作,帮助生成有效可控的事务并发。

集合点有以下三种集合策略,一般可以使用c策略来明确指定并发数。

a.当百分之多少的用户到达集合点时继续执行脚本

b.当百分之多少的运行用户到达集合点时继续执行脚本

c.当多少个用户到达集合点时继续执行继续

集合点函数:lr_rendezvous

当我们录制完脚本后,需要对脚本进一步改进,通过参数化来确保脚本能够动态运行,从而更加真实地模拟真实用户操作。

参数化的步骤主要包括:选择要参数化的内容;设置参数取值以及参数更新方式;回放脚本验证参数值等。参数更新方式有顺序取值、随机取值、唯一取值三种类型,这里就不一一介绍了。

选择要参数化的内容,右键菜单选择“Replace with a Parameter”,点击“Create New Parameter”。

设置参数取值,参数类型可以是File类型、Table类型、Random Number类型、Date/Time类型等。这里使用Table类型,同一行中列名为username及password的记录将作为表单中用户名和密码的动态参数值。除了手动添加参数值外,也可以通过ODBC方式从DB中获取参数值。

参数化后,脚本中的username及password字段取值已经不是静态值了,而是由“{}”包围起来的动态参数值。

2.场景设计与监控

当Vuser Script开发完成后,使用Controller将这个执行脚本的用户从单人转化为多人,从而模拟大量用户操作以形成系统负载。场景是一种模拟大量用户操作的技术手段,通过配置和执行场景向服务器产生负载,监控系统的各项性能指标。

通过对场景的设计,可以生成和用户需求相同的真实负载。场景分为目标场景和手动场景。一般地,我们使用使用自动场景来进行验收测试,使用手动场景来定位性能瓶颈。

通过设置一个运行目标,Controller会自动逐渐增加负载,测试系统能否稳定达到预期目标。如果达标则说明系统的性能符合测试目标,否则提示无法达标。自动场景是定性型性能测试,我们只关心最后性能测试的结论是否符合性能需求。

自动场景中提供了5种目标。手动场景中,可以通过增减Vuser来模拟真实的用户请求,完成负载的生成。手动场景是定量型性能测试,通过观察在负载增加过程中系统各个组件的变化情况,来定位性能瓶颈。

完成场景设计后,点击Run标签页切换到场景监控主界面。在左侧Scenario Groups中列举了所有Vuser的运行状态;在右侧Scenario Status中列举了当前场景的运行情况;在下方Available Graphs中列举了所有可监控的计数器类型,通过添加计数器实例可以让LR监控其性能数据(如CPU、内存使用率等)。

我们可以监控本地服务器或远程Windows/Linux/AIX服务器(监控Linux/AIX需要先安装rstatd组件)以及Weblogic/WebSphere等应用服务器的性能数据。

点击Start Scenario按钮执行场景,可以看到交互计划图开始变化,监控主界面的Vuser状态开始变化,Running Vuser开始增加,Transaction Graphs等计数器开始显示数据。

点击Vusers 按钮可以查看当前所有Vuser的状态,并可以在执行过程中通过Add Vuser及Stop Vuser来动态调整负载情况。选中Vuser,右键选择Show Vuser可以查看该Vuser真实的运行情况。

3.数据分析

待场景执行完毕后,点击Results->Analyze Results来启动数据收集分析器,如图31。它会导入场景数据并生成性能测试报告。

Summary Report包括了场景统计信息、事务摘要、HTTP响应摘要等信息;Graphs默认只包含最基本的一些计数器数据图,可以通过右键Add New Item->Add New Graph来添加你需要的计数器。

在Analysis中经常需要和各种Graphs打交道,这就涉及到图的设置,常用设置包括:

Set Filter/Group By:对图形设置过滤规则;

Set Granularity:设置数据采样点的间距,以秒为单位;

View Raw Data:打开图形对应的原始数据;

Comments:在图中添加注释;

Display Options:设置图形显示样式;

Merge Graphs:对图形进行合并,来直观的获取相关计数器之间的关联关系;

Auto Correlate: 自动分析该图形与其他计数器的关联性,通过它可以发现数据之间的相互依赖性,从而定位性能瓶颈。Collrelation Match代表关联性的强弱程度,数值越大说明关联性越强。

通过本文的案例,我们可以看到LoadRunner在高度模仿真实用户行为(集合点、参数化、虚拟IP、分布式LG等技术)中展示出的优势。

本站文章除注明转载外,均为本站原创或翻译

相关推荐

JPA实体类注解,看这篇就全会了

基本注解@Entity标注于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表。name(可选):实体名称。缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与@Tab...

Dify教程02 - Dify+Deepseek零代码赋能,普通人也能开发AI应用

开始今天的教程之前,先解决昨天遇到的一个问题,docker安装Dify的时候有个报错,进入Dify面板的时候会出现“InternalServerError”的提示,log日志报错:S3_USE_A...

用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码

在人体姿态估计领域,传统方法通常将关键点作为基本处理单元,这些关键点在人体骨架结构上代表关节位置(如肘部、膝盖和头部)的空间坐标。现有模型对这些关键点的预测主要采用两种范式:直接通过坐标回归或间接通过...

B 客户端流RPC (clientstream Client Stream)

客户端编写一系列消息并将其发送到服务器,同样使用提供的流。一旦客户端写完消息,它就等待服务器读取消息并返回响应gRPC再次保证了单个RPC调用中的消息排序在客户端流RPC模式中,客户端会发送多个请...

我的模型我做主02——训练自己的大模型:简易入门指南

模型训练往往需要较高的配置,为了满足友友们的好奇心,这里我们不要内存,不要gpu,用最简单的方式,让大家感受一下什么是模型训练。基于你的硬件配置,我们可以设计一个完全在CPU上运行的简易模型训练方案。...

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目,MessageNest-可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。开源地址:https://github.c...

使用投机规则API加快页面加载速度

当今的网络用户要求快速导航,从一个页面移动到另一个页面时应尽量减少延迟。投机规则应用程序接口(SpeculationRulesAPI)的出现改变了网络应用程序接口(WebAPI)领域的游戏规则。...

JSONP安全攻防技术

关于JSONPJSONP全称是JSONwithPadding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。它的基本原理是利用HTML的元素标签,远程调用JSON文件来实现数据传递。如果...

大数据Doris(六):编译 Doris遇到的问题

编译Doris遇到的问题一、js_generator.cc:(.text+0xfc3c):undefinedreferenceto`well_known_types_js’查找Doris...

网页内嵌PDF获取的办法

最近女王大人为了通过某认证考试,交了2000RMB,官方居然没有给线下教材资料,直接给的是在线教材,教材是PDF的但是是内嵌在网页内,可惜却没有给具体的PDF地址,无法下载,看到女王大人一点点的截图保...

印度女孩被邻居家客人性骚扰,父亲上门警告,反被围殴致死

微信的规则进行了调整希望大家看完故事多点“在看”,喜欢的话也点个分享和赞这样事儿君的推送才能继续出现在你的订阅列表里才能继续跟大家分享每个开怀大笑或拍案惊奇的好故事啦~话说只要稍微关注新闻的人,应该...

下周重要财经数据日程一览 (1229-0103)

下周焦点全球制造业PMI美国消费者信心指数美国首申失业救济人数值得注意的是,下周一希腊还将举行第三轮总统选举需要谷歌日历同步及部分智能手机(安卓,iPhone)同步日历功能的朋友请点击此链接,数据公布...

PyTorch 深度学习实战(38):注意力机制全面解析

在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变...

聊聊Spring AI的EmbeddingModel

序本文主要研究一下SpringAI的EmbeddingModelEmbeddingModelspring-ai-core/src/main/java/org/springframework/ai/e...

前端分享-少年了解过iframe么

iframe就像是HTML的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:独立上下文:每个iframe都拥有独立的DOM/CSS/JS环境(类似浏...