1. LoadRunner性能测试实战精要作为一名从业多年的性能测试工程师我深知LoadRunner在性能测试领域的重要地位。本章将带您深入掌握LoadRunner的核心组件使用技巧、协议选择策略以及脚本开发全流程这些都是我多年实战经验的结晶。1.1 LoadRunner三大核心组件解析LoadRunner由三个关键组件构成完整的性能测试工作流1. VuGenVirtual User Generator脚本开发环境支持录制和手工编写虚拟用户行为提供完整的调试工具链日志输出、断点调试等典型工作流程录制→增强→调试→优化实战建议录制时关闭所有无关程序确保脚本纯净度2. Controller场景设计中枢控制虚拟用户并发策略实时监控系统资源指标CPU、内存、IO等支持分布式压力生成关键功能Rendezvous集合点、IP SpoofingIP欺骗3. Analysis测试结果分析平台自动生成专业图表报告支持自定义指标计算数据分析技巧重点关注90%百分位响应时间经验之谈三个组件建议安装在同一台性能较好的机器上Controller和Analysis对内存需求较高8G是基本配置。1.2 协议选择的艺术与科学协议选择是LoadRunner使用的第一个技术门槛选错协议会导致录制失败或脚本不可用。根据被测系统架构协议选择遵循以下原则系统类型推荐协议典型场景Web应用HTTP/HTML大多数B/S系统文件传输FTP文件服务器邮件系统IMAP/POP3/SMTP邮件客户端测试数据库应用ODBC/JDBC数据库直连测试原生客户端Windows Sockets自定义协议应用API服务Web ServicesREST/SOAP接口常见踩坑点混合协议系统要选择Multiple Protocols微信小程序等新型应用可能需要选择HTTPWebSocket金融行业专用协议需要定制开发我曾在一个政务系统项目中因为最初只选择了HTTP协议导致无法录制到关键的ActiveX控件交互后来补充选择Windows Sockets协议才解决问题。1.3 脚本开发全流程实战1.3.1 录制技巧进阶录制是脚本开发的第一步但绝非简单点击记录按钮录制配置详解Application type区分B/SInternet Applications和C/SWin32 ApplicationsProgram to record指定浏览器路径避免使用默认浏览器URL Address带协议头的完整地址如https://录制过程控制使用浮动工具栏灵活控制录制过程合理划分Action建议按业务模块划分避免使用浏览器回退功能会导致脚本混乱录制后检查检查是否生成有效脚本验证关键业务步骤是否完整确认没有录制到无关请求// 典型录制生成的脚本结构 vuser_init() { // 初始化操作如登录 return 0; } Action() { // 核心业务操作 web_url(首页, URLhttp://example.com, LAST); return 0; } vuser_end() { // 结束操作如登出 return 0; }1.3.2 脚本优化四步法录制生成的原始脚本往往存在冗余需要经过优化才能用于正式测试清理阶段删除无关请求如广告、统计代码移除静态资源请求可选处理EXTRARES额外资源增强阶段添加事务Transaction插入集合点Rendezvous设置检查点Checkpoint参数化阶段识别需要参数化的数据设计参数化策略实现动态数据替换调试阶段使用lr_output_message调试输出设置断点逐步执行分析回放日志优化前后对比我曾优化过一个电商下单脚本从原始2000行代码精简到800行回放成功率从60%提升到99%。1.3.3 参数化深度解析参数化是模拟真实用户行为的关键技术主要解决三类问题避免重复操作如重复下单满足数据唯一性要求如注册测试实现数据驱动测试参数化类型对比表类型适用场景优点缺点文件参数化中小规模数据配置简单维护成本高数据库参数化大规模数据数据实时性高需要数据库支持随机数参数化无需特定值使用简单可控性差高级参数化技巧使用UniqueEach Occurrence组合实现数据唯一性参数文件采用CSV格式支持多列数据通过lr_save_string动态生成参数// 数据库参数化示例 Action() { // 从数据库获取用户名 lr_eval_string({db_username}); // 使用参数化值 web_submit_data(login, Actionhttp://example.com/login, MethodPOST, Nameusername, Value{db_username}, ENDITEM, LAST); return 0; }1.3.4 关联技术实战关联处理服务器返回的动态数据如SessionID、Token是脚本开发中最具挑战的部分关联三要素左边界LB动态值前的固定字符串右边界RB动态值后的固定字符串关联变量保存提取值的变量名关联实现步骤使用web_reg_save_param注册关联函数确定左右边界可通过对比多个回放日志验证关联值是否正确提取// 典型关联示例 web_reg_save_param(sessionid, LBname\sessionid\ value\, RB\, SearchBody, LAST); web_submit_data(login, Actionhttp://example.com/login, MethodPOST, LAST); // 使用关联值 web_url(homepage, URLhttp://example.com/home?sessionid{sessionid}, LAST);关联调试技巧先用lr_output_message输出关联值验证正确性再用于后续请求。1.4 检查点与事务设计1.4.1 检查点实现方案检查点用于验证系统返回的正确性主要有两种实现方式文本检查点web_reg_find(TextLogin Success, SaveCountlogin_check, LAST);图片检查点web_image_check(CheckLogo, Src/images/logo.png, LAST);检查点最佳实践只在关键业务步骤设置检查点测试执行时关闭非必要检查点影响性能结合SaveCount实现灵活验证1.4.2 事务设计原则事务用于衡量业务操作的性能指标设计时应考虑事务粒度粗粒度如用户登录细粒度如输入用户名、输入密码、点击登录事务嵌套支持多级事务嵌套避免过度嵌套影响可读性事务状态LR_PASS成功LR_FAIL失败LR_AUTO自动判断// 事务典型用法 lr_start_transaction(登录流程); web_url(登录页面, ..., LAST); lr_start_transaction(输入凭证); web_submit_data(提交登录, ..., LAST); lr_end_transaction(输入凭证, LR_AUTO); web_url(首页, ..., LAST); lr_end_transaction(登录流程, LR_AUTO);1.5 脚本调试技巧大全1.5.1 日志分析三板斧回放日志关注标红错误信息检查关键步骤执行状态验证参数化值是否正确替换输出消息使用lr_output_message输出调试信息区分普通消息和错误消息lr_error_message快照比对录制和回放快照对比使用自带浏览器查看页面差异1.5.2 断点调试技巧断点类型行断点暂停在指定代码行条件断点满足条件时触发调试控制单步执行Step Over/Into继续执行Continue停止调试Stop变量监控查看参数当前值监控服务器返回数据// 调试输出示例 Action() { char *username lr_eval_string({param_user}); lr_output_message(当前用户%s, username); // 设置条件断点 if(strcmp(username, admin) 0) { lr_output_message(管理员登录); } return 0; }1.6 性能测试脚本设计思想优秀的性能测试脚本应该具备以下特征真实性模拟真实用户操作间隔思考时间符合实际用户操作路径使用生产环境数据分布可维护性清晰的脚本结构充分的注释说明模块化设计健壮性完善的错误处理合理的超时设置足够的日志信息可扩展性支持参数化扩展便于添加新功能适应环境变化我在金融行业项目中总结的脚本设计checklist[ ] 是否包含必要的思考时间[ ] 关键业务步骤是否有检查点[ ] 动态数据是否正确处理[ ] 错误处理是否完备[ ] 脚本是否易于维护2. 高级脚本开发技巧2.1 自定义函数开发当内置函数无法满足需求时可以开发自定义函数DLL函数调用lr_load_dll(user.dll); user_encrypt(input, output);Java函数调用lr_java_call(com.example.Utils, encrypt, {param1}, ResultParam);Web Service调用web_service_call(StepNameEncryptData, SOAPMethodEncryptService|EncryptPortType|Encrypt, ResponseParamresult, LAST);2.2 复杂逻辑处理LoadRunner支持丰富的编程逻辑可以处理复杂测试场景条件判断if(strcmp(lr_eval_string({status}), success) 0) { lr_output_message(操作成功); } else { lr_error_message(操作失败); }循环控制for(i1; i10; i) { lr_output_message(当前迭代%d, i); // 业务操作 }数组处理// 保存为参数数组 lr_save_array(value1,value2,value3, param_array); // 访问数组元素 lr_paramarr_idx(param_array, 1);2.3 脚本性能优化高性能脚本可以减少资源消耗提高测试效率减少不必要的日志lr_set_debug_message(LR_MSG_CLASS_EXTENDED_LOG, LR_SWITCH_OFF);合理设置超时web_set_timeout(CONNECT, 60, LAST);连接复用web_set_sockets_option(KEEP_ALIVE, 1);缓存控制web_cache_cleanup();2.4 跨协议脚本开发复杂系统往往需要组合多个协议HTTPWebSocket组合HTTP处理常规页面请求WebSocket处理实时消息ODBCHTTP组合ODBC验证数据库变更HTTP模拟用户操作多协议开发要点注意协议执行顺序处理协议间数据传递统一错误处理机制// HTTPODBC组合示例 Action() { // HTTP操作 web_url(查询页面, URL..., LAST); // ODBC验证 lr_db_connect(StepName连接数据库, ConnectionStringDSNtestdb;, LAST); lr_db_executeSQLStatement(StepName验证数据, SQLSELECT COUNT(*) FROM orders, Count, LAST); lr_db_disconnect(StepName断开连接, LAST); return 0; }3. 实战经验总结3.1 常见问题排查指南问题现象可能原因解决方案录制无脚本生成协议选择错误确认被测系统使用的协议回放时报404错误动态数据未关联检查URL中的动态参数参数化不生效参数文件路径错误使用绝对路径指定参数文件检查点失败页面内容变化更新检查点文本或边界事务响应时间长缺少思考时间添加合理的思考时间3.2 性能测试黄金法则二八原则20%的脚本覆盖80%的业务场景优先保证核心业务流程脚本质量逐步加压从低并发开始逐步增加压力观察系统性能变化曲线结果可重复确保测试环境一致性记录完整的测试配置瓶颈定位先确定瓶颈类型CPU/内存/IO/网络再分析具体原因代码/配置/架构3.3 效率提升技巧脚本模板化建立常用脚本模板库封装通用函数库自动化校验开发自动检查脚本实现结果自动分析团队协作使用版本控制系统管理脚本建立脚本评审机制持续学习关注LoadRunner新特性学习性能测试新方法在电商项目中我们通过建立脚本模板库使新业务脚本开发时间从3天缩短到1天且错误率降低60%。