在LoadRunner中,VuGen函数是增强脚本、模拟复杂用户行为和获取精准性能数据的核心程序函数。下面汇总了主要的VuGen函数和主要用途:
事务控制:
lr.start_transaction()、lr.end_transaction(),定义事务的开始与结束,测量关键业务的响应时间。
lr.set_transaction(),设置事务的其他属性(如状态、详细信息)。
参数化:
lr.eval_string(),获取参数当前值。
lr.save_string(),将字符串保存为参数。
lr.save_var(),将变量值保存为参数(用于非字符串类型)。
检查点:
web_reg_find(),在服务器返回内容中查找特定文本,用于验证结果正确性。
web_image_check(),检查页面上的特定图片。
集合点:
lr.rendezvous(),设置集合点,使多个虚拟用户在同一时刻执行某个操作,模拟并发。
关联:
web_reg_save_param(),从服务器响应中捕获动态数据并保存为参数,供后续请求使用。
web_save_param(),保存参数(具体用途根据协议可能有所不同)。
日志与输出:
lr.log_message(),记录日志消息到输出窗口。
lr.output_message(),输出消息。
lr.error_message(),记录错误消息。
lr.vuser_status_message(),设置Vuser状态消息,在Controller中可见。
节奏控制:
lr.think_time(),在脚本中插入思考时间,模拟用户操作间隔。
掌控业务度量:事务函数
事务(Transaction),用于衡量服务器响应一个或多个业务操作所需的时间。
基本用法:用 lr.start_transaction("事务名") 标记开始,lr.end_transaction("事务名", LR_AUTO) 标记结束。LR_AUTO 会让 LoadRunner 根据事务是否成功自动设置状态(通过或失败)。
注意事项:
事务名称应清晰描述所衡量的业务操作(如 "Login"、"CreateOrder")。
确保事务只包含你想要测量的服务器响应时间,避免包含不必要的客户端处理或思考时间。
模拟多样数据:参数化函数
参数化(Parameterization),用参数替换脚本中的常量值,让虚拟用户在执行时使用不同的数据。
lr.eval_string("{ParameterName}"):在脚本需要参数值的地方使用此函数。例如,将登录用户名参数化:web_submit_data("login.php", ..., "Name=username", "Value={Username}", ...),VuGen在回放时会自动用参数值替换 {Username}。多数情况下,直接在需要参数的地方使用参数(如 {Username})即可,lr.eval_string 在一些需要将参数值作为函数参数或进行复杂字符串拼接的场景下更灵活。
参数类型选择:根据测试需求选择合适的参数类型,例如从数据文件中获取测试数据,或使用唯一数(Unique Number)、随机数(Random Number) 等。
验证业务正确性:检查点函数
检查点(Check Point),也称为验证点(Text Check/Image Check),用于验证服务器返回的内容是否符合预期,确保脚本执行的正确性。
web_reg_find():这是一个注册型(Registration-Type) 函数,必须在发起HTTP请求(如 web_url)之前调用。它告诉VuGen在接下来的服务器响应中查找指定文本。
c
// 在请求"login.php"之前注册检查点,查找"Welcome"文本
web_reg_find("Search=Body",
"Text=Welcome",
"SaveCount=LoginSuccessCount",
LAST);
web_submit_data("login.php", ...);
// 之后可根据lr.eval_int('{LoginSuccessCount}')判断是否登录成功
web_image_check():用于验证页面上是否存在特定的图片。
制造峰值压力:集合点函数
集合点(Rendezvous),用于模拟瞬时并发操作。
lr.rendezvous("RendezvousName");:将集合点插入到脚本中希望虚拟用户同时执行某个操作的位置(例如,点击“提交订单”按钮前)。当大量Vuser执行到集合点时,会在这里暂停,等待Controller发出指令再同时继续。
处理动态数据:关联函数
关联(Correlation) 用于处理服务器返回的动态值(如会话ID、令牌),这些值需要捕获并在后续请求中使用。
web_reg_save_param():这也是一个注册型函数,必须在发起目标请求之前调用。它从接下来的服务器响应中捕获符合条件(如左、右边界)的动态数据,并将其保存为一个参数。
c
// 在请求生成订单页面前,捕获动态的OrderID
web_reg_save_param("OrderID", "LB=name=\"orderId\" value=\"", "RB=\">", "Ord=1", LAST);
web_url("checkout.php", ...);
// 后续请求可以使用lr.eval_string('{OrderID}')获取捕获的订单ID
记录运行状态:日志与输出函数
这些函数用于在脚本执行过程中输出信息,辅助调试和结果分析。
lr.log_message("Debug: User login successful.");:将消息记录到日志文件(默认在output.txt)。
lr.output_message("Info: Starting transaction 'Payment'.");:将消息输出到Controller的“输出”窗口和日志。
lr.error_message("ERROR: Failed to find the expected text!");:记录错误消息。
调试时可多用日志输出,正式负载测试时则应减少日志级别以避免I/O瓶颈。
模拟真实用户:思考时间函数
思考时间(Think Time),模拟真实用户在不同操作之间的停顿。
lr.think_time(5);:让Vuser在执行下一条语句前暂停5秒。你可以在Controller中设置是否使用录制的思考时间,或按比例缩放。
脚本增强
明确测试目标:根据性能测试目标决定需要增强脚本的哪些部分。
合理使用事务:事务不宜过多或嵌套过深,避免自身开销影响性能数据的准确性。
检查点和关联的时机:确保 web_reg_find 和 web_reg_save_param 这类注册型函数在对应的请求函数之前调用。
参数化数据准备:参数化所用数据文件的数据应真实有效,数据量要充足(至少不小于虚拟用户数×迭代次数),并注意数据唯一性要求。
脚本可读性和可维护性:添加适当的注释,使用有意义的事务名、参数名、集合点名。