1. 项目概述:为什么需要一份清晰的VuGen协议清单?
如果你正在或者准备使用LoadRunner进行性能测试,那么VuGen(Virtual User Generator)这个脚本录制和开发工具,你一定不陌生。它的核心任务,就是模拟真实用户的行为,向被测系统发送请求。而“模拟”的第一步,就是选择正确的“语言”——也就是协议。选错了协议,就像试图用英语和一位只懂法语的人深入交流,结果往往是脚本录制失败、回放报错,测试工作从一开始就卡住了。
网上关于LoadRunner的资料很多,但当你真正需要一份完整、准确、且能反映当前版本支持情况的VuGen协议清单时,往往会发现信息要么过于陈旧(比如还停留在LR 11甚至更早的版本),要么零散不全,或者充斥着大量无关的广告和教程链接。这份清单的缺失,直接导致很多测试工程师在项目初期就要花费大量时间在“试错”上:尝试各种协议组合,看哪个能录到流量,效率极低。
因此,我决定结合自己多年的使用经验,以及查阅官方文档和社区资料,整理出这份针对当前主流LoadRunner版本(以LoadRunner 2024及LR 12.x为基准)的VuGen支持协议详细清单。这不仅仅是一张列表,我更会为你拆解每个协议家族的应用场景、选择逻辑,以及在实际工作中如何快速判断和选型,帮你把“协议选择”这个模糊的环节,变成一个清晰、可执行的决策过程。
2. VuGen协议全览:从通用Web到深度定制
VuGen支持的协议并非一成不变,它会随着技术演进和市场需求不断更新。总体来看,其协议库可以划分为几个大的阵营:Web与应用层协议、中间件与数据库协议、客户端/服务器架构协议以及定制化协议。理解这个分类,能帮助你在面对一个陌生系统时,快速缩小选择范围。
2.1 Web与应用层协议:互联网性能测试的基石
这是最常用、也最庞大的一个类别,涵盖了绝大多数基于浏览器的B/S架构应用和主流移动端API的测试。
1. Web - HTTP/HTML这是VuGen的“元老”和“王牌”协议。它通过捕获浏览器与服务器之间的HTTP/HTTPS请求来生成脚本。对于绝大多数Web应用,这都是首选。
- 核心原理:在浏览器(或移动端App)与服务器之间插入一个代理(Proxy),所有流量经过代理时被VuGen捕获并转换为C语言(或JavaScript等)的API调用,如
web_url,web_submit_data等。 - 适用场景:所有基于HTTP/HTTPS的网页浏览、表单提交、AJAX异步请求、单页应用(SPA)等。
- 实操要点:
- 录制模式选择:通常选择“基于浏览器的应用程序”并使用代理模式。对于现代复杂应用(如大量WebSocket、Fetch API),可能需要使用“Web - HTTP/HTML (DevWeb)”协议,它基于Chromium内核,对现代Web标准支持更好。
- 关联与动态值:这是使用该协议的核心难点。VuGen的“关联”功能可以自动或手动识别并处理服务器返回的动态值(如Session ID、CSRF Token),务必在录制后优先运行“扫描关联”功能。
2. WebSocket随着实时通信应用的普及,WebSocket协议变得至关重要。它提供了全双工通信通道,传统HTTP协议无法有效模拟。
- 核心原理:VuGen可以录制WebSocket握手(HTTP Upgrade请求)及后续的数据帧(Data Frames)。生成的脚本会使用如
web_websocket_connect,web_websocket_send,web_websocket_receive等专用函数。 - 适用场景:在线聊天、实时游戏、股票行情、协同编辑等任何需要服务器主动向客户端推送数据的场景。
- 实操心得:
录制WebSocket最容易出问题的地方不是录不到,而是录到了但回放失败。常见问题包括握手失败、连接意外关闭。关键检查点在于:录制时是否成功捕获了
Upgrade: websocket的请求头;脚本中WebSocket服务器的地址和端口是否正确;以及是否需要处理连接建立后的心跳包(Ping/Pong)来维持连接。有时需要手动修改脚本,添加web_websocket_set_option来配置超时和帧类型。
3. SAP GUI用于测试SAP的经典Windows客户端(GUI for Windows)的性能。它直接录制用户在SAP GUI界面上的操作,如点击事务码、输入字段、点击按钮等。
- 核心原理:通过Hook技术拦截SAP GUI与SAP应用服务器之间的RFC(Remote Function Call)通信,将其转化为VuGen脚本。
- 适用场景:企业内对SAP ERP、CRM、SCM等系统进行端到端的性能测试,模拟真实用户操作SAP客户端。
- 注意事项:录制前需确保SAP GUI客户端已正确安装并登录。录制生成的脚本与SAP的屏幕(Screen)和字段(Field)ID强相关,如果SAP界面版本变更,脚本可能需要调整。
4. Citrix ICA / Microsoft Remote Desktop (RDP)用于测试虚拟桌面(VDI)和远程应用发布的性能。这类测试关注的是用户在远程会话中的操作流畅度,而不仅仅是后端服务器的响应。
- 核心原理:录制在Citrix或Windows远程桌面会话中屏幕的像素变化、鼠标点击和键盘输入事件。它模拟的是“用户看到什么、操作什么”,而非具体的网络协议。
- 适用场景:评估Citrix XenApp/XenDesktop或Microsoft RDS(远程桌面服务)环境的用户体验和服务器承载能力。
- 实操要点:这类测试对负载机(Load Generator)的资源消耗较大,因为需要渲染远程画面。通常需要单独的性能监控指标,如“每秒屏幕刷新数”、“鼠标点击延迟”等,这些需要在Analysis中额外配置。
2.2 中间件与数据库协议:直击系统后端核心
当测试需要绕过前端界面,直接对服务接口或数据库进行压测时,这类协议就派上用场了。它们通常用于组件测试或接口性能验证。
1. Java over HTTP / .NET这并不是指通用的HTTP,而是特指用于录制基于Java(如J2EE)或.NET(如ASP.NET)技术栈的远程方法调用。它能够识别并录制如Java RMI、.NET Remoting或基于HTTP的SOAP/WCF服务调用。
- 核心原理:通过特定的代理或插件,拦截Java虚拟机(JVM)或.NET CLR中的方法调用和序列化数据流,生成直接调用这些方法的脚本。
- 适用场景:测试独立的服务层、微服务接口,或者当前端界面复杂但后端接口清晰时,直接对接口进行压测效率更高。
- 选择逻辑:如果你的应用是纯Spring Boot提供的RESTful API,用标准的“Web - HTTP/HTML”可能更简单。但如果涉及复杂的RMI或.NET Remoting调用,这个协议能更准确地模拟客户端桩(Stub)的行为。
2. ODBC / Oracle / MS SQL Server直接对数据库进行性能测试,模拟大量并发用户执行SQL操作。
- 核心原理:通过数据库的原生客户端库(如OCI for Oracle, ODBC Driver),录制和回放SQL语句。脚本中包含
lr_db_connect,lr_db_executeSQLStatement等函数。 - 适用场景:
- 数据库存储过程、函数的性能测试。
- 验证数据库服务器在高并发查询/更新下的表现。
- 在应用层开发完成前,提前对数据模型和SQL语句进行性能摸底。
- 重要提醒:谨慎使用。直接压测数据库通常不是模拟真实用户行为的最佳方式,容易忽略应用服务器层的逻辑和连接池管理。它更适合DBA或开发人员进行针对性的数据库层基准测试。务必在独立的测试数据库上进行,避免影响生产数据。
3. SOAP / REST (Web Services)专门用于测试基于SOAP或REST架构的Web服务。VuGen提供了向导,可以方便地导入WSDL(Web Services Description Language)文件或直接输入服务端点(Endpoint)来生成测试脚本,而无需通过浏览器录制。
- 核心原理:对于SOAP,通过解析WSDL生成可调用的方法;对于REST,则通过分析服务描述或手动构造HTTP请求(方法、URL、头、体)。
- 适用场景:所有面向服务的架构(SOA)或微服务架构中的API性能测试。这是当前后端分离、移动端应用测试中最常用的协议之一。
- 实操技巧:使用“Service - SOA”协议创建脚本时,利用“Import”功能直接导入WSDL或Swagger/OpenAPI文档,可以自动生成所有可用的操作框架,极大提升脚本开发效率。参数化和关联的处理思路与Web协议类似,重点关注XML或JSON响应中的动态数据。
2.3 客户端/服务器与标准应用协议
这类协议模拟的是传统C/S架构或特定标准协议的应用。
1. Windows Sockets (Winsock)最底层、最灵活的协议。它直接录制和发送原始的TCP/IP或UDP网络数据包。当你的应用使用自定义的、非标准的二进制协议时,这是唯一的选择。
- 核心原理:捕获应用程序在Socket层发送和接收的原始字节流。生成的脚本包含
lrs_send,lrs_receive,lrs_create_socket等函数,你需要手动处理缓冲区(Buffer)中的数据。 - 适用场景:游戏服务器(自定义协议)、金融交易系统(如FIX协议)、工业控制协议(如部分Modbus TCP实现)或任何非HTTP的私有TCP/UDP应用。
- 经验之谈:
使用Winsock协议门槛较高,要求测试人员对网络编程和被测协议格式有深入理解。最大的挑战在于“关联”,因为VuGen无法自动理解你的二进制协议格式中的动态内容(如长度字段、校验和、序列号)。你需要通过
lrs_save_param或lrs_save_searched_string函数,结合偏移量(Offset)和长度(Length),像外科手术一样精确地从接收到的二进制数据中提取动态值,并在下一个请求中回填。这通常需要开发人员的协议文档支持。
2. FTP / SMTP / POP3用于测试文件传输和邮件服务器的性能。
- 核心原理:模拟FTP客户端进行文件上传、下载、列表等操作;模拟邮件客户端通过SMTP发送邮件、通过POP3接收邮件。
- 适用场景:网盘服务、邮件系统、依赖文件交换的企业应用。
3. DNS / LDAP用于测试域名解析服务和目录服务的性能。
- 适用场景:评估DNS服务器在高并发查询下的响应能力;测试如Microsoft Active Directory等LDAP目录服务的认证、查询性能。
2.4 定制化与行业专用协议
LoadRunner还支持通过额外的协议扩展包(Protocol Extension Packs)来添加对更多专业协议的支持。这些通常需要单独购买或授权。
- Tuxedo / CORBA:用于测试传统的分布式事务处理中间件。
- Siebel:专门用于测试Oracle Siebel CRM套件。
- PeopleSoft:专门用于测试Oracle PeopleSoft应用。
- Oracle NCA:用于测试Oracle早期的Forms应用。
- SAP - Web (Click and Script):较老的SAP Web Dynpro测试协议。
- Flex / Silverlight:用于测试已逐渐淘汰的RIA(富互联网应用)技术,目前基本不再使用。
关于网络热词中提及的协议说明: 在您提供的热词中,出现了大量如Modbus RTU/TCP、CAN、I2C、SPI、MQTT、TCP/IP、蓝牙等协议。这里需要明确一个关键点:VuGen是一个软件测试工具,其协议支持的核心是“模拟客户端软件通过网络发送的报文”。
TCP/IP,UDP,HTTP,WebSocket,MQTT等网络应用层协议,是VuGen直接支持或可通过Winsock模拟的。- 像
Modbus RTU、CAN、I2C、SPI这类属于工业现场总线或板级通信协议,它们通常运行在串口或专门的硬件链路上,并非标准的以太网TCP/IP协议栈。VuGen无法直接支持。要测试这类设备或系统的性能,通常需要:- 设备厂商提供基于TCP/IP封装的网关或服务器软件(例如,Modbus RTU over TCP网关),此时可以对网关的TCP服务使用Winsock协议进行测试。
- 使用专门的硬件测试设备或LabVIEW等工具编写测试程序。
- 开发一个模拟客户端,将VuGen的Winsock协议与设备的专用驱动库结合(技术难度极高)。
- 类似地,
PCIe、AXI、APB是芯片内部总线协议,MIPI是移动设备内部接口协议,完全不在VuGen的测试范畴内。
3. 协议选择实战指南:四步锁定正确协议
面对一个具体的被测系统,如何快速准确地选择协议?可以遵循以下四步法:
第一步:识别系统架构与技术栈
- B/S Web应用:首选Web - HTTP/HTML。如果是现代单页应用(React, Vue, Angular),考虑尝试Web - HTTP/HTML (DevWeb)。
- 手机App/小程序:核心测试其后台API。使用抓包工具(如Fiddler, Charles)分析流量,如果是HTTP/HTTPS,则用Web - HTTP/HTML;如果有WebSocket,则需同时支持WebSocket。
- 桌面客户端(C/S):
- 如果客户端通过HTTP与服务器通信(如很多Electron应用),用Web - HTTP/HTML。
- 如果使用自定义TCP端口通信,用Windows Sockets。
- 如果是SAP GUI、Citrix等特定客户端,直接选择对应专用协议。
- 微服务/API服务:直接使用SOAP/REST (Web Services)协议,通过导入接口文档创建脚本。
第二步:利用VuGen的“协议探测”功能在VuGen中创建新脚本时,选择“录制 - 使用代理录制”或“录制 - 基于浏览器的应用程序”,VuGen会尝试自动检测流量并推荐协议。这是一个很好的起点。
第三步:交叉验证与组合协议一个复杂的应用往往使用多种协议。例如:
- 一个交易网站:登录、浏览用Web - HTTP/HTML,实时报价推送用WebSocket。
- 一个企业应用:Web前端用Web - HTTP/HTML,后台报表生成调用Java over HTTP服务。 在VuGen中,创建脚本时可以选择多个协议。当自动探测或单一协议录制不完整时,尝试添加最可能的候选协议组合(如同时勾选“Web - HTTP/HTML”和“WebSocket”)。
第四步:终极验证——录制与回放选择协议并开始录制,执行一些典型操作后停止。检查生成的脚本:
- 脚本是否完整?关键请求是否都被捕获?
- 回放是否成功?在不做任何关联的情况下,单用户回放能否通过?
- 日志是否有线索?回放日志中如果出现“无法识别的响应”、“动态值需要关联”等提示,是正常现象。但如果出现大量“连接失败”、“协议错误”,则可能协议选择不当。
4. 常见问题与排查技巧实录
即使按照指南操作,在实际工作中仍会碰到各种问题。以下是我总结的几个高频问题及解决思路。
问题1:录制时浏览器没反应,抓不到任何请求。
- 可能原因与排查:
- 代理设置问题:VuGen录制时会设置系统或浏览器的代理到本地端口(如7777)。检查浏览器代理设置是否正确指向了
localhost:7777。某些浏览器(如Chrome)可能使用系统代理,而另一些(如Firefox)可独立设置。 - 防火墙/安全软件拦截:临时禁用防火墙或安全软件,确认是否其阻止了VuGen代理进程。
- HTTPS证书问题:对于HTTPS网站,VuGen会安装一个根证书到系统。首次录制某网站时,浏览器可能会提示证书不安全,需要手动接受或信任。确保VuGen的证书已正确安装。
- 应用程序类型选错:如果被测应用是桌面客户端但内部嵌用了浏览器组件(如CefSharp),应选择“基于浏览器的应用程序”而非“Win32应用程序”。
- 代理设置问题:VuGen录制时会设置系统或浏览器的代理到本地端口(如7777)。检查浏览器代理设置是否正确指向了
- 实操心得:
最稳妥的方法是,在开始录制后,立即在浏览器中访问一个绝对可靠的网站,如
http://www.baidu.com。如果能抓到百度的请求,说明VuGen代理工作正常,问题出在被测应用本身(可能是它绕过了系统代理)。如果连百度的请求都抓不到,那肯定是VuGen代理配置或环境问题。
问题2:脚本回放失败,报错“Error -26612: HTTP/1.1 404 Not Found”。
- 问题解析:这是一个典型的“动态会话”或“上下文依赖”问题。服务器返回404,说明请求的URL资源不存在。往往是因为脚本中包含了录制时的特定会话ID或上下文路径,回放时这些值已失效。
- 解决步骤:
- 运行自动关联:在VuGen的“Design Studio”或“Tools”菜单中,找到“Scan Script for Correlations”或“Auto-Correlation After Recording”,让工具自动扫描并关联动态值。
- 手动关联:如果自动关联不成功,需要对比录制和回放的服务器响应。在“Recording Log”和“Replay Log”中,找到导致404的那个请求,查看其之前的那个服务器响应。通常在这个响应里,会包含一个用于构造下一个请求URL或参数的动态值(如
jsessionid=xxxx)。使用web_reg_save_param_ex函数,通过左边界(LB)和右边界(RB)将这个值提取出来,并替换到后续请求中。 - 检查思考时间(Think Time)和步调(Pacing):有时服务器处理有状态请求需要时间,立即发送下一个请求可能导致上下文未就绪。适当增加思考时间或调整步调策略。
问题3:使用Winsock协议录制自定义协议,回放时服务器无响应或响应错误。
- 问题解析:二进制协议的回放失败,几乎百分之百是“数据包边界”或“动态内容替换”问题。
- 排查清单:
- 数据一致性检查:使用
lrs_get_buffer_by_name函数打印出录制时发送的缓冲区(buffer)和回放时即将发送的缓冲区。进行二进制比较,看是否有字节不同。不同的地方就是需要关联的动态字段。 - 长度字段更新:很多二进制协议在报文头都有一个“长度(Length)”字段,表示整个报文的大小。如果你关联并替换了报文体中某个可变长度的内容(如用户名),必须同步更新这个“长度”字段的值。这是一个极易被忽略的坑。
- 字节序(Endian)问题:如果协议中包含了多字节整数(如int, short),需要确认服务器使用的是大端序(Big-Endian)还是小端序(Little-Endian)。VuGen脚本中处理二进制数据时默认是C语言的主机字节序,可能需要使用
lrs_set_byte_order函数进行调整,或手动转换。 - Socket选项:检查
lrs_create_socket中设置的协议类型(TCP/UDP)、超时时间等是否与录制时一致。
- 数据一致性检查:使用
问题4:压测时,随着并发数上升,错误率飙升,但服务器资源(CPU、内存)还很空闲。
- 问题解析:这通常不是协议选择错误,而是脚本或场景设计问题,或者遇到了被测系统的并发限制。
- 排查方向:
- 参数化数据唯一性:检查脚本中使用的参数(如用户名、订单号)是否设置了“Unique(唯一)”且数据量足够。如果多个虚拟用户使用了相同的标识符(如重复登录同一账号),可能导致服务器端会话冲突。
- 连接池与资源泄漏:检查脚本中是否正确关闭了连接(如数据库连接、Socket连接)。在
vuser_end部分是否释放了所有资源?如果每个用户都新建连接而不关闭,会快速耗尽服务器或中间件的连接池。 - 集合点(Rendezvous)滥用:如果设置了集合点,大量用户在同一时刻释放,可能瞬间冲垮系统的某个薄弱环节(如登录验证服务)。尝试移除或调整集合点策略。
- 检查系统级限制:查看被测系统的应用服务器(如Tomcat maxThreads)、数据库(如MySQL max_connections)或操作系统(如文件描述符数量、网络端口范围)的并发连接数配置。使用
netstat等命令监控压测过程中的连接状态。
一份准确的协议清单是LoadRunner性能测试的起点,但真正的功夫在于理解每个协议背后的原理和适用边界。面对一个具体系统,没有放之四海而皆准的答案,最好的方法就是“大胆假设,小心求证”:基于系统架构做出初步判断,利用VuGen的工具进行探测和验证,通过录制和回放的结果来最终确认。记住,协议选型的终极目标,是让VuGen生成的脚本能够最真实、最有效地模拟出真实用户对系统产生的压力。把这个环节搞扎实了,后续的并发设计、场景执行和结果分析才有了可靠的基础。