在LoadRunner中使用VuGen处理异步通信,下面介绍修改Vuser脚本以适应异步通信的具体操作方法。
理解异步通信和扫描
在深入修改之前,我们需要理解VuGen如何处理异步通信:
异步通信模式:主要包括推送(Push)、轮询(Polling) 和长轮询(Long Polling)。这些模式不同于传统的同步请求-响应,服务器可以主动向客户端推送数据,或客户端需要频繁检查服务器更新。
异步扫描(Async Scan):VuGen录制脚本后,会启动一个异步扫描过程,自动检测脚本中的异步通信实例。请确保在录制选项中启用了此功能。
异步对话(Async Conversation):VuGen会将检测到的异步通信划分为一个或多个"对话"(Conversation),每个对话代表一个独立的异步交互单元。你可以在VuGen的Design Studio的异步选项卡中查看这些对话。
修改脚本的主要步骤
在VuGen完成异步扫描后,通常会自动对脚本进行修改。主要任务是验证和进一步完善这些自动修改的部分。这个过程主要包括以下步骤:
插入注册函数:VuGen会在异步对话开始前插入 web_reg_async_attributes 函数。这个注册型函数(意味着它必须在异步请求发起之前执行)用于标识异步对话的开始,并定义其行为模式(Pattern)、目标URL以及相关的回调函数。请确保它位于异步请求之前。
c
web_reg_async_attributes("Push_0",
"Pattern=Push",
"URL=http://push.example.com/example",
"RequestCB=Push_0_RequestCB",
"ResponseHeadersCB=Push_0_ResponseHeadersCB",
"ResponseBodyBufferCB=Push_0_ResponseBodyBufferCB",
"ResponseCB=Push_0_ResponseCB",
LAST);
添加注释说明:VuGen通常会在 web_reg_async_attributes 函数前添加详细的注释,说明这个异步对话的ID、包含的URL以及建议的回调函数。请仔细阅读这些注释。
处理原始脚本步骤:
对于推送(Push) 对话,VuGen通常不会删除原始录制的脚本步骤,但会插入额外的异步API函数。
对于轮询(Polling) 和长轮询(Long Polling) 对话,VuGen可能会注释掉或删除一些原始的脚本步骤或参数,如果这些步骤的功能将由它插入的异步函数来处理。必要时可能需要取消注释这些步骤。
标记对话结束:VuGen会在异步对话结束时插入 web_stop_async 函数来标记对话的终止。
c
web_stop_async("Push_0", LAST);
实现回调函数:这是最需要你投入精力的部分。VuGen的异步扫描会检测到需要回调函数,并可能在 AsyncCallbacks.c 文件中为你生成这些回调函数的空实现(或者直接在脚本中注释说明)。你需要根据测试需求,在这些回调函数中添加具体的处理逻辑。主要的回调函数类型包括:
RequestCB:处理异步请求。
ResponseHeadersCB:处理响应头信息。
ResponseBodyBufferCB:处理响应体数据。
ResponseCB:处理完整的响应。
不同异步模式的修改差异
VuGen会根据检测到的异步通信类型(推送、轮询或长轮询)对脚本进行不同的修改。这些主要差异:
推送 (Push):通常保留原始录制步骤,同时插入异步API函数和相关回调函数。
轮询 (Polling):可能注释或删除部分原始轮询步骤,因为这些步骤的功能将由插入的异步函数来处理。请检查这些被注释的步骤是否必要。
长轮询 (Long Polling):处理方式和轮询类似,可能注释或删除部分原始长轮询步骤,由异步函数接管相关逻辑。
调试和验证修改
脚本修改完成后,务必进行充分的调试和验证:
使用日志输出:在回调函数中使用 lr_output_message() 或 lr_error_message() 输出调试信息,这有助于跟踪脚本执行流程和数据传递。
设置断点:利用VuGen的断点功能,在主要位置(如回调函数开始处)暂停脚本执行,以便逐步观察变量状态和执行路径。
检查关联:修改后的脚本可能需要额外的关联操作。如果异步响应中包含动态数据(如令牌Token),且后续请求需要使用这些数据,你通常需要手动添加关联函数(如 web_reg_save_param_regexp)来捕获这些动态值。请记住,关联函数是注册型函数,必须放在它们要捕获内容的请求之前。
回放验证:修改并调试后,多次回放脚本,确保其能稳定、正确地模拟异步行为,不出现错误,并且业务逻辑完整。
示例
假设你录制了一个包含服务器推送消息的脚本,VuGen异步扫描后可能生成了类似以下结构的脚本(已简化):
c
// VuGen 自动添加的注释,说明异步对话和信息
web_reg_async_attributes("Push_0", "Pattern=Push", "URL=...", "RequestCB=...", "ResponseCB=...", LAST);
// 原始的或其他触发推送的请求(例如发起一个长连接)
web_url("start_push", ...);
// ... 其他脚本步骤 ...
// 异步对话结束
web_stop_async("Push_0", LAST);
同时,在 AsyncCallbacks.c 文件中,你会找到相关的回调函数框架,你需要在其中实现处理推送消息的逻辑。
处理异步通信脚本时,请牢记:
确保 web_reg_async_attributes 等注册型函数位于作用的请求之前。
仔细实现回调函数,这是模拟异步行为、处理响应数据的主要。
留意VuGen对原始脚本步骤的修改(如注释掉的步骤),根据测试逻辑判断是否需要保留或调整。
做好关联,处理好异步通信中的动态数据。