第三方CNAS/CMA软件测试测评机构【LoadRunner的JSON和XML响应数据的关联和处理技巧】

API性能测试JSON和XML是主要的响应数据格式。LoadRunner提供了多种强大且灵活的方法来处理这两种格式的数据。

1. JSON响应数据处理

LoadRunner处理JSON主要有两种方法:使用web_reg_save_param_ex配合"Json=All"边界(简单情形)和使用lr_json_string_to_value等原生JSON函数(复杂、推荐)。

方法一:使用边界函数

适用于提取简单的、位于固定结构中的值。

cpp 复制代码
// 在返回JSON的请求前,注册一个关联函数

web_reg_save_param_ex(

    "ParamName=json_response",

    "LB=",

    "RB=",

    "SEARCH_FILTERS=Json=All", // 重点:声明响应是JSON

    LAST);



web_custom_request("get_user",

    "URL=http://api.zmtests.com/user/123",

    "Method=GET",

    LAST);



// 此时,`json_response`参数包含了整个JSON响应体。

// 你可以使用类似XML的方法,通过`lr_eval_string_ext`和字符串查找来分析,但这很笨拙。

// 对于嵌套的JSON,更推荐下面的方法二。

方法二:使用原生JSON函数(LoadRunner 11.52+,推荐)

处理JSON最强大、最专业的方式。

cpp 复制代码
#include "lrw_custom_body.h"

#include "lrw_json.h" // 保证包含JSON头文件



Action()

{

    const char *json_string = NULL;

    JSON *json_obj = NULL;

    char *extracted_value = NULL;



    web_reg_save_param_ex("ParamName=json_resp", "LB=", "RB=", "SEARCH_FILTERS=Json=All", LAST);

    web_custom_request("get_user", "URL=...", LAST);



    // 步骤1: 将参数化的JSON字符串转换为JSON对象

    json_string = lr_eval_string("{json_resp}");

    json_obj = lr_json_string_to_value(json_string, NULL, NULL, NULL);



    // 步骤2: 使用JSON Path表达式提取值

    // 假设响应体为: {"data": {"user": {"id": 1001, "name": "john_doe"}, "level": "VIP"}}

    extracted_value = lr_json_get_string(json_obj, "$.data.user.id", NULL); // 提取 id

    lr_save_string(extracted_value, "extracted_user_id");

    lr_log_message("提取到的用户ID: %s", extracted_value);



    extracted_value = lr_json_get_string(json_obj, "$.data.user.name", NULL); // 提取 name

    lr_save_string(extracted_value, "extracted_user_name");



    // 步骤3: 处理JSON数组

    // 假设响应体为: {"items": [{"sku": "A001"}, {"sku": "A002"}]}

    JSON *items_array = lr_json_get_array(json_obj, "$.items", NULL);

    int array_size = lr_json_get_array_size(items_array);

    for (int i = 0; i < array_size; i++) {

        JSON *item_obj = lr_json_get_array_item(items_array, i);

        extracted_value = lr_json_get_string(item_obj, "$.sku", NULL);

        lr_log_message("商品 %d 的SKU: %s", i+1, extracted_value);

        // 可以将SKU保存到数组中,供后续参数化使用

        sprintf(param_name, "SKU_%d", i+1);

        lr_save_string(extracted_value, param_name);

    }



    // 步骤4: 释放JSON对象内存(重要!)

    lr_json_free_value(json_obj);



    // 步骤5: 使用提取的值发起下一个请求

    web_custom_request("update_user",

        "URL=http://api.zmtests.com/user/{extracted_user_id}/update",

        "Body={\"newName\": \"{extracted_user_name}_updated\"}",

        LAST);



    return 0;

}

文章来源:卓码软件测评

精彩推荐:点击蓝字即可
软件负载测试API自动化测试软件测试第三方软件测试软件性能测试软件测试机构

2. XML响应数据处理

处理XML主要使用web_reg_save_param_ex配合"Xml=All",并结合XPath或左右边界。

方法一:使用XPath(最精确、推荐)

cpp 复制代码
// 在返回XML的请求前,注册关联函数

web_reg_save_param_ex(

    "ParamName=user_id_list", // 存储多个一致值的数组

    "LB=",

    "RB=",

    "SEARCH_FILTERS=Xml=All, XPath=/Response/Users/User/@id", // 重点:使用XPath

    // XPath 表达式提取所有User节点的id属性

    LAST);



web_custom_request("get_users_xml",

    "URL=http://api.zmtests.com/users.xml",

    LAST);



// 提取成功后,可以使用来下方式访问:

int count = atoi(lr_eval_string("{user_id_list_count}")); // 获取一致项总数

for (int i = 1; i <= count; i++) {

    sprintf(param_name, "{user_id_list_%d}", i); // 创建参数名,如 user_id_list_1

    lr_log_message("用户ID %d: %s", i, lr_eval_string(param_name));

}

方法二:使用左右边界(适用于简单或固定位置)

cpp 复制代码
web_reg_save_param_ex(

    "ParamName=single_user_name",

    "LB=<Name>",

    "RB=</Name>",

    "Ordinal=1", // 提取第一个一致项

    "SEARCH_FILTERS=Xml=All", // 声明响应是XML,分析器会更严格

    LAST);

3. 注意事项

关联位置:关联函数(web_reg_save_param_ex)必须放置在目的请求之前。

动态边界:如果左右边界本身是动态的,可以结合已关联的参数来构造新的边界字符串,有时需要转义。

JSON/XML声明:在使用web_reg_save_param_ex时,必须根据响应格式正确使用"Json=All"或"Xml=All"。这会让VuGen使用相应的分析器,而不是简单的文本一致,从而更可靠。

错误处理:在使用lr_json_get_string等函数后,应检查返回值是不是为NULL,以防止后续脚本因空指针而崩溃。

性能考量:复杂的XPath或JSON Path表达式以及大型文档的分析会消耗一定的CPU资源。在负载测试中,如果每个虚拟用户都频繁进行复杂分析,可能会影响测试机本身的性能。对于在负载中只需提取一次的值(如会话ID),应放在vuser_init中处理。

内容检查:除了关联,还可以使用web_reg_find配合"Search=Json"或"Search=Xml"来证明响应体中是不是包含某个特定的JSON键值对或XML节点。

通过熟练掌握以上针对JSON和XML的关联和处理技巧,能够高效地应对绝大多数根据RESTful API或SOAP Web服务的应用系统的性能测试脚本开发工作。

相关推荐
U盘失踪了3 小时前
coze 工作流生成测试用例
测试用例
线束线缆组件品替网4 小时前
Finisar AOC/DAC 在高速网络互连中的应用解析
网络·数码相机·测试工具·电脑·pcb工艺·游戏机
测试19985 小时前
如何使用Appium实现移动端UI自动化测试?
自动化测试·软件测试·python·测试工具·ui·appium·测试用例
Thomas_YXQ6 小时前
Unity3D中提升AssetBundle加载速度的详细指南
java·spring boot·spring·unity·性能优化·游戏引擎·游戏开发
jason.zeng@15022077 小时前
Task进行CI/CD简单又适用
ci/cd
上海云盾-小余7 小时前
WAF性能优化:如何平衡安全防护与网站访问速度?
网络·安全·性能优化
康康的AI博客8 小时前
用Claude Code构建企业级GitHub CI/CD安全自动化流程
安全·ci/cd·github
EndingCoder8 小时前
性能优化:类型系统的最佳实践
linux·前端·javascript·ubuntu·性能优化·typescript
2301_780669868 小时前
单元测试、反射、注解、动态代理
java·单元测试