
1. 项目概述为什么LoadRunner依然是性能测试的基石在软件交付节奏越来越快的今天性能问题往往是压垮项目的最后一根稻草。一个功能完备的系统可能在几十个并发用户访问时就响应迟缓甚至直接崩溃。作为从业十多年的测试老兵我见过太多项目在临近上线时才手忙脚乱地开始“压测”结果发现数据库连接池耗尽、内存泄漏、接口超时等一系列问题导致项目延期甚至回炉重造。性能测试尤其是负载测试和压力测试绝不是上线前的“临门一脚”而应该是贯穿开发周期的质量保障活动。在众多性能测试工具中LoadRunner简称LR无疑是一个“老牌劲旅”。尽管市场上涌现了JMeter、Gatling等开源后起之秀但LoadRunner 12.02版本在协议支持深度、场景设计灵活性、监控分析的专业性上依然有其不可替代的优势。它尤其适合测试企业级复杂应用比如支持多种协议混合HTTP/HTTPS, WebSocket, Oracle, SAP等的场景其强大的资源监控和深入的结果分析能力能帮助测试人员精准定位从网络层到应用层、再到数据库层的性能瓶颈。这篇文章我将基于LoadRunner 12.02为你拆解其核心使用流程。我的目标不是复述官方手册而是结合我多年踩坑经验告诉你如何高效地搭建脚本、设计场景、分析结果并避开那些新手最容易掉进去的“坑”。无论你是刚接触性能测试的新人还是想从开源工具转向更专业解决方案的工程师这篇内容都能为你提供一条清晰的实践路径。2. LoadRunner 12.02 核心组件与工作流解析在深入实操之前我们必须先理解LoadRunner的架构。它不是一个单一的工具而是一个由多个组件协同工作的套件。LoadRunner 12.02的经典三件套包括Virtual User Generator (VuGen)、Controller和Analysis。这三者的关系好比一场军事演习VuGen是训练单个士兵虚拟用户的教官Controller是运筹帷幄、指挥千军万马的司令官而Analysis则是战后的复盘专家负责分析演习数据。2.1 三大核心组件职责详解Virtual User Generator (VuGen) 脚本开发与调试车间这是所有工作的起点。VuGen的核心任务是录制或编写模拟用户行为的脚本。它通过代理的方式捕获你与待测应用AUT, Application Under Test之间的网络通信并生成对应协议的脚本代码默认是C语言。这里的关键在于VuGen生成的不仅仅是“点击流”它捕获了完整的请求、响应、会话信息如Session ID、Token以及思考时间Think Time。一个健壮的脚本是性能测试成功的一半。在VuGen中你还需要做大量的脚本增强工作例如参数化用变量替代固定值模拟不同用户数据、添加事务Transaction用于度量关键操作的响应时间、插入检查点检查服务器返回的内容是否正确以及处理关联动态获取服务器返回的、在后续请求中需要使用的值如订单号。注意很多新手录制完脚本就直接去跑场景这是大忌。录制只是“毛坯房”参数化、关联、检查点这些增强工作才是“精装修”它们直接决定了你的测试场景是否真实、结果是否可信。Controller 负载场景设计与指挥中心当你在VuGen中打磨好单个用户的脚本后就需要在Controller中组织一场“集团军作战”。Controller允许你定义复杂的负载场景负载生成器管理你可以将脚本分发到多台负载生成器Load Generator机器上以产生远超单机能力的并发压力。虚拟用户组与调度配置不同的虚拟用户组分别执行不同的脚本并设置各自的用户加载策略如每分钟启动50个用户持续运行10分钟。目标导向场景这是LoadRunner的一大特色。你可以直接设定测试目标例如平均事务响应时间低于3秒让Controller自动调整并发用户数来尝试达到该目标非常适合容量规划和基准测试。实时监控在场景运行期间Controller可以实时监控服务器资源如Windows性能计数器、Linux的CPU/内存、数据库计数器等和事务性能数据。Analysis 结果分析与瓶颈定位实验室场景执行完毕后会生成一个结果文件.lrr。Analysis组件就是用来打开这个文件进行深度数据分析的。它提供了丰富的图表和报告帮助你从海量数据中找出规律和问题。一个专业的性能测试工程师大部分时间其实都花在Analysis上。你需要学会看合并图Merge Graphs将事务响应时间图与系统资源利用率图如CPU、内存、磁盘I/O、网络叠加从而判断响应时间变慢是否由某个资源瓶颈引起。此外错误统计、网页细分图Web Page Breakdown能帮你定位到是网络传输慢、还是服务器处理慢、或是前端渲染慢。2.2 性能测试典型工作流理解了组件整个工作流就清晰了需求分析与计划明确测试目标如支持5000用户同时登录、确定测试场景如混合场景20%用户浏览70%用户搜索下单10%用户管理后台、识别关键业务事务。脚本开发VuGen针对关键事务录制脚本并进行参数化、关联、添加事务和检查点等增强最后在VuGen中单用户回放调试通过。场景设计Controller基于测试计划在Controller中创建场景分配负载生成器设置用户加载方式、运行时间、监控指标。执行场景与监控Controller运行场景并实时观察事务通过率、错误率和服务器资源状况必要时进行干预。结果分析Analysis场景结束后详细分析结果定位性能瓶颈是应用代码问题、数据库问题、还是中间件配置问题并出具性能测试报告。这个流程是环环相扣的。我经常对团队成员说“在Controller里点下‘Start Scenario’按钮之前你必须确保脚本是可靠的场景设计是合理的。否则你得到的将是一堆毫无意义的垃圾数据浪费的不仅是时间更是整个团队对性能测试的信心。”3. 从零到一脚本录制与增强实战理论讲完我们进入实战环节。假设我们要测试一个简单的Web登录和搜索系统。我们的目标是模拟100个用户以不同的用户名密码登录后进行商品搜索。3.1 协议选择与录制技巧打开VuGen创建新脚本时第一步就是选择协议。对于大多数Web应用HTTP/HTTPS选择“Web - HTTP/HTML”协议即可。这里有个关键点如果您的应用大量使用AJAX、WebSocket或单页面应用SPA技术可能需要考虑选择“Web - HTTP/HTML”下的“AjaxClick and Script”录制方式或者结合其他协议。开始录制前在录制配置中建议将“Recording”模式设置为“HTML-based script”。这种模式下VuGen会基于HTML操作生成脚本脚本更简洁关联更容易适合基于浏览器的应用。而“URL-based script”模式则会记录所有HTTP请求脚本冗长适用于非浏览器客户端或需要精细控制请求的场景。录制过程很简单点击录制输入目标URLVuGen会打开浏览器或你指定的应用程序你只需像真实用户一样操作——访问首页、输入用户名密码登录、在搜索框输入关键词并搜索。操作完成后停止录制VuGen会自动生成脚本。生成的脚本主要包含以下几个部分web_url 访问一个URL。web_submit_form/web_submit_data 提交表单数据如登录。web_link/web_image 模拟点击链接或图片。lr_think_time 思考时间模拟用户操作间隔。3.2 脚本增强四大核心操作刚录制的脚本是“死”的所有数据都是录制时用的固定值。我们需要让它“活”起来。1. 参数化Parameterization这是模拟不同虚拟用户行为的关键。例如登录用户名和密码不能都用“test1”。我们需要将脚本中的固定值替换为参数。操作在脚本中选中“test1”这个字符串右键选择“Replace with a Parameter”。创建参数给参数命名如“Username”。参数类型选择“File”。这意味着我们将从一个外部文件中读取数据。编辑参数文件点击“Edit with Notepad”会打开一个.dat文件。你可以按列录入多组用户名和密码例如Username,Password user1,pass1 user2,pass2 ... (以此类推至少准备100组以上数据)设置更新方式在参数属性中设置“Select next row”为“Unique” “Update value on”为“Each iteration”。这保证了每个虚拟用户在每次迭代中都会取到唯一且不重复的一行数据。2. 关联Correlation这是LoadRunner脚本开发中最具挑战性的一步。很多应用在交互中会产生动态值如会话IDJSESSIONID、视图状态__VIEWSTATE、一次性令牌Token等。这些值在录制时是固定的但回放时服务器会生成新的如果不动态获取脚本就会因数据不匹配而失败。自动关联VuGen提供自动关联功能Scan for Correlation 或 CtrlF8。在录制后或回放失败后运行工具会尝试找出需要关联的动态值。但自动关联并非万能尤其是对于自定义的或结构复杂的动态数据。手动关联必须掌握的技能这需要你具备一定的HTTP协议和正则表达式知识。步骤是 a. 对比录制和回放时的服务器响应在回放日志或使用抓包工具。 b. 找到那个在录制时有固定值、但回放时值不同的字符串。 c. 在脚本中找到生成该值的请求通常是上一个请求在其后使用web_reg_save_param_ex函数或类似函数来捕获这个动态值。这个函数是一个“注册型”函数必须放在产生动态值的请求之前。 d. 将捕获到的参数替换到后续需要使用该值的请求中。 例如捕获一个名为correlationToken的动态值web_reg_save_param_ex( ParamNamecorrelationToken, LBtoken:\, RB\, SEARCH_FILTERS, LAST); web_url(api/getData...); // 这个请求的响应中会包含 token lr_output_message(捕获到的Token是%s, lr_eval_string({correlationToken})); // 在下一个请求中使用这个Token web_submit_data(api/submit, ItemDatatoken{correlationToken}dataxxx, LAST);这里的LB左边界和RB右边界是用于定位动态值的正则表达式片段。3. 插入事务Transaction事务用于度量一个或多个操作的响应时间。我们将关键业务操作如登录、搜索用事务包围起来。操作在登录操作开始前插入lr_start_transaction(Login)在登录操作结束后插入lr_end_transaction(Login, LR_AUTO)。LR_AUTO表示由LoadRunner自动判断该事务成功与否基于HTTP状态码等。你也可以用LR_PASS或LR_FAIL手动标记。4. 添加检查点Text Check检查点用于验证服务器返回的内容是否正确确保业务逻辑成功而不仅仅是HTTP 200 OK。例如登录成功后页面会显示“欢迎[用户名]”。操作在登录请求后使用web_reg_find函数同样是注册型函数必须放在请求前来搜索响应文本中是否包含特定字符串。web_reg_find(FailNotFound, SearchBody, Text欢迎, LAST); web_submit_form(login.pl...);如果找不到“欢迎”文本该函数会标记失败你可以在运行时设置中配置让这个失败导致事务失败。完成以上增强后务必在VuGen中使用单用户模式多次迭代回放脚本确保没有语法错误、关联正确、检查点通过。这是后续场景测试可靠性的基石。4. 构建真实负载Controller场景设计精要脚本准备就绪接下来就是在Controller中设计负载模型。一个糟糕的场景设计可能会让测试结果完全偏离实际情况。4.1 规划虚拟用户组与负载生成器在Controller中你可以添加多个脚本形成不同的虚拟用户组Vuser Group。例如你可以创建一个“浏览用户组”和一个“下单用户组”模拟不同的用户行为。如果你的并发用户数很高例如超过1000单台机器可能无法产生足够的压力或者会因自身资源限制成为瓶颈。这时就需要配置负载生成器Load Generator。你可以在其他机器上安装LoadRunner的负载生成器组件然后在Controller中将其添加进来并将部分虚拟用户分配到这些远程机器上执行。确保负载生成器与待测系统网络通畅且负载生成器本身资源CPU、内存、网络带宽充足。4.2 设计负载模式三种经典模式解析Controller提供了几种负载模式理解其区别至关重要面向目标的场景Goal-Oriented Scenario适用场景容量规划、基准测试。例如“我想知道系统在保证平均响应时间小于2秒的前提下最多能支持多少用户同时搜索”设置你设定一个目标如事务响应时间2秒Controller会采用“爬坡”方式自动增加虚拟用户数直到达到目标临界点或系统崩溃。这是一种探索系统极限的高效方式。手工场景Manual Scenario适用场景最常用、最灵活的场景。你可以精确控制每个用户组的用户数量、加载和退出方式。核心设置计划生成器Schedule Builder初始化Initialize所有虚拟用户在开始运行前初始化即加载脚本到内存。建议设置为“在所有虚拟用户运行前初始化”避免启动时的额外开销影响数据。启动Start Vusers设置虚拟用户如何启动。例如“每15秒启动2个用户”这是一种渐进式加载可以模拟真实的用户逐渐进入系统的情况避免对系统造成瞬时冲击。如果设置为“同时启动所有用户”就是经典的“压力测试”或“峰值测试”用于检验系统在突发流量下的表现。持续时间Duration设置虚拟用户启动后持续运行多长时间。例如“运行30分钟”。在持续时间内虚拟用户会按照脚本迭代运行。停止Stop Vusers设置虚拟用户如何停止。例如“每30秒停止5个用户”这是一种渐进式退出。百分比模式在手工场景中你可以不指定绝对用户数而是为每个脚本组分配一个百分比例如浏览用户占60%下单用户占40%然后设定总虚拟用户数。Controller会自动按比例分配。这便于快速调整业务模型。4.3 配置运行时设置与资源监控在场景中可以批量修改所有虚拟用户的“运行时设置”Run-Time Settings这比在VuGen中逐个修改高效得多。关键设置包括思考时间Think Time这里可以统一忽略思考时间为了产生最大压力或者使用录制时的思考时间乘以一个系数更真实。日志Log在调试阶段可以开启“扩展日志”但在正式负载测试时为了减少磁盘I/O和网络开销对测试结果的影响务必设置为“仅在错误时发送消息”。速度模拟Speed Simulation可以模拟不同的网络带宽如拨号、宽带这对于测试网络敏感型应用很重要。迭代次数Iteration可以设置每个用户在场景持续时间内运行的迭代次数。资源监控是定位瓶颈的眼睛。在Controller的“运行”视图中可以添加被监控服务器的计数器。对于Windows服务器添加“Windows Resources”监控器输入服务器IP、管理员账号密码选择关键的计数器如% Processor TimeCPU使用率、Available Mbytes可用内存、Avg. Disk Queue Length磁盘队列长度、Network Interface\Bytes Total/sec网络吞吐量。对于Linux服务器通常需要通过rstatd或ssh方式配置监控。监控数据库如Oracle、SQL Server的关键计数器也同样重要。5. 从数据到洞见Analysis结果深度分析指南场景运行完毕我们拿到了原始数据。Analysis的作用就是将这些数据转化为有价值的洞见。打开结果文件你会看到数十张图表。不要被吓到我们按图索骥。5.1 核心图表解读与关联分析概要报告Summary Report首先看这里。关注总通过事务数和总失败事务数。如果有失败测试基本不成功。查看平均事务响应时间与需求目标对比。运行虚拟用户数图Running Vusers这张图展示了在整个场景运行期间并发虚拟用户数的变化曲线。它应该与你设计的加载策略如渐进加载相符。如果曲线出现异常骤降可能意味着大量用户因错误而提前退出。平均事务响应时间图Average Transaction Response Time这是最重要的图表之一。关注关键事务如Login、Search的响应时间曲线。理想情况下在负载稳定期响应时间应该保持平稳或缓慢上升。如果出现随着用户数增加响应时间急剧上升的拐点那个点可能就是系统的性能瓶颈点。每秒事务数图Transactions per Second, TPSTPS反映了系统的处理能力。在负载增加时TPS应该随之上升直到达到系统处理上限成为一条水平线或开始下降。将TPS图与响应时间图对照看当TPS达到峰值不再增长而响应时间开始飙升时说明系统已经饱和。吞吐量图Throughout表示服务器每秒接收和发送的数据量字节。它的趋势通常与TPS相似。错误统计图Errors per Second监控每秒发生的错误数。任何非零的错误都需要被深入分析。真正的技术活合并图Merge Graphs单独看每张图只能发现问题合并图才能定位原因。例如你发现“Search”事务的响应时间在测试后半段显著变慢。右键点击“平均事务响应时间图”选择“Merge Graphs”。选择“Overlay”然后将“Windows资源”下的“%Processor Time”计数器合并进来。观察如果CPU使用率在响应时间变慢时也接近100%那么很可能是应用服务器CPU成了瓶颈。同理你可以合并内存、磁盘I/O、数据库活动事务数等图表。如果响应时间变慢时磁盘队列长度很高则可能是磁盘I/O瓶颈如果数据库的“User Connections”很高且“Buffer Cache Hit Ratio”很低则可能是数据库瓶颈。5.2 网页细分图与网络时间分析对于Web应用Analysis提供的“网页细分图Web Page Diagnostics”是神器。它可以将一个页面的总响应时间分解为网络时间DNS解析、连接建立、SSL握手、第一次缓冲时间收到第一个字节的时间。服务器时间从收到第一个字节到收到最后一个字节的时间这基本反映了服务器的处理时间。客户端时间浏览器渲染时间在LoadRunner中通常忽略。如果“第一次缓冲时间”很长可能问题出在网络延迟或服务器前端如Web服务器处理缓慢。如果“接收时间”很长可能意味着服务器返回的数据量过大或网络带宽不足。这个细分能帮你快速将问题定位到前端网络、后端应用还是数据库。5.3 生成与解读性能测试报告Analysis支持生成丰富的报告。你可以自定义报告内容通常一份标准的性能测试报告应包含测试目标与场景概述。测试环境配置硬件、软件、网络拓扑。关键性能指标汇总最大并发用户数、事务通过率、平均/90%响应时间、TPS峰值、系统资源峰值利用率。详细图表分析包括合并图分析结论。发现的性能瓶颈及根本原因分析例如当并发用户达到800时应用服务器CPU持续高于95%导致‘Search’事务响应时间从1.5秒上升至8秒。建议优化XX服务的算法或增加应用服务器节点。优化建议与风险提示。报告的价值在于用数据和图表说话为开发团队和决策者提供明确的优化方向和容量规划依据。6. 避坑指南LoadRunner 12.02 实战常见问题与调优最后分享一些我多年使用LoadRunner 12.02积累下来的“血泪教训”和调优技巧这些在官方手册里往往找不到。6.1 脚本开发阶段常见陷阱关联失败脚本回放报错这是最常见的问题。除了掌握手动关联技巧外一个很好的习惯是在录制前清理浏览器缓存和Cookie使用无痕模式或专用测试浏览器进行录制。这能减少录制到不必要的、易变的缓存数据。对于复杂的动态值不要完全依赖自动关联学会看服务器的原始响应在VuGen的回放日志中设置显示详细日志。思考时间处理不当在VuGen调试时保留思考时间有助于脚本正确执行因为有些操作依赖于前一个操作的完成。但在Controller进行高并发测试时通常需要忽略或大幅缩短思考时间以产生足够的压力。你可以在Controller的场景“运行时设置”中全局调整思考时间策略。数据量不足导致参数化冲突如果你设置了参数化为“Unique”但准备的参数文件只有100行却让200个虚拟用户各迭代2次共需要400条唯一数据那么后200次迭代就会因取不到数据而失败。规则是参数文件中的行数 (虚拟用户数 × 迭代次数)。建议多准备一些数据并设置“When out of values”为“Abort Vuser”或“Continue in a cyclic manner”循环取用但会降低唯一性。6.2 场景执行与监控阶段疑难杂症虚拟用户无法初始化或大量失败检查负载生成器状态在Controller中负载生成器的状态必须是“Ready”。如果是“Failed”检查网络连通性、防火墙是否关闭了端口、LoadRunner Agent进程magentproc是否在远程机器上正常运行。检查许可证LoadRunner的并发用户数受许可证限制。如果尝试初始化超过许可数量的用户超出的部分会失败。在帮助菜单中查看“关于”可以确认许可证信息。检查脚本路径确保Controller中引用的脚本路径是有效的并且所有参数文件、包含文件都存在于该路径下。最好使用相对路径或UNC网络路径。场景运行期间TPS上不去检查加压机负载生成器资源登录到负载生成器机器查看其CPU、内存和网络使用率。如果负载生成器自身的CPU已经跑满那么它就无法产生更多的压力。这就是为什么需要多台负载生成器来分担压力。检查网络带宽如果被压测的系统在远程数据中心而负载生成器在办公室网络可能办公室出口带宽先被占满。使用ping和tracert检查网络延迟和丢包。检查被压测系统可能被测系统本身已经达到瓶颈如数据库连接池满、应用服务器线程池耗尽无法处理更多请求。此时TPS曲线会持平响应时间会飙升。需要结合资源监控判断。监控计数器连接失败Windows监控确保在Controller机器上能通过\\目标IP\C$访问被监控Windows服务器且使用的账号有管理员权限。有时需要关闭双方防火墙或在被监控机上开启“文件和打印机共享”及“远程管理”例外。Linux监控确保rstatd服务已安装并启动rpc.rstatd且端口通常是UDP 111可访问。更现代的方法是使用SSH配合sar等命令但这需要更复杂的配置。6.3 结果分析阶段易犯错误只看平均值忽略百分比平均响应时间具有欺骗性。如果99个用户响应时间是1秒1个用户是100秒平均下来接近2秒看似不错但实际上有1%的用户体验极差。一定要关注90%百分位响应时间或标准偏差。Analysis中可以在事务性能摘要里设置显示这些值。90%响应时间意味着90%的事务响应时间低于该值这个指标更能代表大多数用户的体验。忽略“热身期”和“冷却期”数据在场景刚开始的几分钟用户加载期和最后几分钟用户退出期系统负载不稳定数据波动大。在分析时应该在Analysis中使用“筛选器Filter”过滤掉这些时间段的数据只分析稳定运行期间的数据这样结论才更准确。不会使用“自动关联”功能Analysis提供了一个强大的“自动关联Auto Correlate”功能。你可以选中一个事务响应时间图表点击“自动关联”工具会自动分析在事务变慢的时间点哪些系统资源计数器CPU、内存、磁盘等也出现了异常波动并给出关联度建议。这是快速定位瓶颈的捷径。LoadRunner 12.02是一个功能强大的专业工具其学习曲线确实比一些开源工具要陡峭。但一旦你掌握了它的核心逻辑和这些实战技巧它将成为你进行企业级性能测试和深度瓶颈分析的得力助手。记住工具只是手段核心是你的性能测试思维明确目标、设计真实场景、精准分析数据、定位根本原因。