news 2026/5/1 19:02:17

软件国产化信创测试机构【高级参数化:如何从数据库实时读取测试数据到LoadRunner脚本】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
软件国产化信创测试机构【高级参数化:如何从数据库实时读取测试数据到LoadRunner脚本】

性能测试使用静态参数文件往往无法模拟真实情形的动态性,尤其是当测试数据需要和当前数据库状态保持实时一致时。LoadRunner通过强大的数据库查询功能,支持在脚本运行时直接从数据库实时获取数据,实现真正动态的参数化。

根据LoadRunner 12.55及以上版本使用 C语言(HTTP协议) 脚本进行数据库实时参数化。

1. 原理和配置

此方法的重要是利用LoadRunner的 lr_db_connect、lr_db_executeSQLStatement 等数据库函数,在 vuser_init 部分建立和数据库的持久连接,在 Action 部分执行SQL语句并将结果提取到参数中。

前置配置:

数据库驱动:保证LoadRunner的bin目录下有所需数据库的ODBC驱动或原生驱动(如Oracle的oci.dll)。一般需要安装对应的数据库客户端。

数据源(DSN)配置(可选但推荐):在系统的ODBC数据源管理器中,创建一个“系统DSN”。这能简化连接字符串,并集中管理连接配置。如,创建一个名为 PerfDB 的DSN,指向你的测试数据库。

包含头文件:在脚本开头,包含数据库操作的头文件:#include "lrd.h"。

2. 实现步骤

步骤一:在vuser_init中建立数据库连接

连接应在初始化时建立一次,以供整个脚本运行期间复用,避免每次查询都建立连接的开销。

vuser_init() { lr_db_connect("StepName=DBConnect", "ConnectionString=Provider=MSDASQL;DSN=PerfDB;UID=testuser;PWD=testpass;", // 使用DSN // 或使用连接字符串: "ConnectionString=Driver={MySQL ODBC 8.0 Unicode Driver};Server=10.0.1.100;Database=test_db;UID=uid;PWD=pwd;", "ConnectionName=MyCon", // 为连接指定一个别名,后续操作使用 "ConnectionType=ODBC", // 连接类型,可以是ODBC、OLEDB、Oracle等 LrLastArg); lr_log_message("数据库连接成功建立。"); return 0; }

步骤二:在Action中执行查询并参数化

需要执行SQL语句,并将结果集的一列或多列值存储到LoadRunner参数中。

Action() { // 步骤1: 声明结果集和行句柄 LRD_DB_INFO db_info; LRD_RESULT_INFO res_info; LRD_CURSOR *cursor = NULL; LRD_VALUE value; // 步骤2: 执行SQL查询语句。此处查询一个需要使用的动态ID和名称。 lr_db_executeSQLStatement("StepName=GetDynamicData", "ConnectionName=MyCon", "SQLStatement=SELECT user_id, account_name FROM t_users WHERE status = 'ACTIVE' AND create_date > SYSDATE - 1 ORDER BY user_id", "DatasetName=MyDataset", // 为结果集命名 LrLastArg); // 步骤3: 获取结果集的第一行数据,并将其存储到参数中。 // 获取指定列的值(按列索引,从1开始) lr_db_getValue("StepName=GetValue_UserId", "ConnectionName=MyCon", "DatasetName=MyDataset", "ColumnIndex=1", // 对应`user_id`列 "OutParam=Param_UserId", // 将值存入参数 `Param_UserId` LrLastArg); lr_db_getValue("StepName=GetValue_AccName", "ConnectionName=MyCon", "DatasetName=MyDataset", "ColumnIndex=2", // 对应`account_name`列 "OutParam=Param_AccountName", // 将值存入参数 `Param_AccountName` LrLastArg); // 步骤4: 在日志中输出获取的参数,用于调试 lr_log_message("获取到的用户ID: %s, 账户名: %s", lr_eval_string("{Param_UserId}"), lr_eval_string("{Param_AccountName}")); // 步骤5: 在HTTP请求中使用这些动态参数(示例) web_reg_find("Text={Param_AccountName}", LAST); lr_start_transaction("api_get_user_info"); web_custom_request("get_user_info", "URL=http://api.zmtests.com/user/{Param_UserId}", "Method=GET", ... LAST); lr_end_transaction("api_get_user_info", LR_AUTO); return 0; }

步骤三:处理多行结果集和游标遍历

如果需要使用查询结果的多行数据(如模拟不同用户并发操作),则需要使用游标进行遍历。

// 在 vuser_init 中连接数据库(同上) // 在 Action 中 Action() { LRD_CURSOR *cursor = NULL; int row_count = 0; // 执行查询,获取所有活跃用户 lr_db_executeSQLStatement("StepName=GetAllUsers", "ConnectionName=MyCon", "SQLStatement=SELECT user_id FROM t_users WHERE status = 'ACTIVE'", "CursorName=MyCursor", // 指定游标名 LrLastArg); // 获取游标,用于遍历 lr_db_fetch("StepName=FetchNext", "ConnectionName=MyCon", "CursorName=MyCursor", LrLastArg); // 循环遍历游标中的每一行 while (lr_db_next_row("ConnectionName=MyCon", "CursorName=MyCursor") == LR_OK) { row_count++; lr_db_getValue("StepName=GetCurrentUserId", "ConnectionName=MyCon", "CursorName=MyCursor", "ColumnIndex=1", "OutParam=CurrentUserId", // 每行的值存入同一个参数,但值会更新 LrLastArg); lr_log_message("正在处理第%d行,用户ID: %s", row_count, lr_eval_string("{CurrentUserId}")); // 使用 CurrentUserId 发起业务请求... web_custom_request("process_user", "URL=http://api.zmtests.com/process?uid={CurrentUserId}", "Method=POST", LAST); } lr_log_message("总共处理了 %d 行数据。", row_count); // 关闭游标,释放资源(重要!) lr_db_close_cursor("ConnectionName=MyCon", "CursorName=MyCursor"); return 0; }

文章来源:卓码软件测评

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

步骤四:在vuser_end中关闭数据库连接

vuser_end() { lr_db_disconnect("StepName=DBDisconnect", "ConnectionName=MyCon", LrLastArg); lr_log_message("数据库连接已关闭。"); return 0; }

3. 注意事项

连接池和性能:在vuser_init中建立的连接是该虚拟用户的专有连接。在情形中,大量虚拟用户同时建立连接会对数据库造成压力,需保证数据库能承受此连接数。

错误处理:必须检查每个数据库函数的返回值。使用lr_db_last_error函数在失败时获取详细错误信息,并记录到日志。

SQL优化:保证执行的SQL语句本身是高效的,避免在性能测试脚本中引入全表扫描等慢查询。

参数唯一性:当使用游标遍历时,如果需要在同一迭代中多次使用同一行的不同列,需及时将值保存到不同的参数中,因为lr_db_next_row会使游标前进。

事务划分:将数据库查询操作本身包含在一个独立的事务中(如lr_start_transaction("sql_query")),有助于在分析结果时精确了解数据准备阶段所消耗的时间。

通过以上高级参数化技术,可以创建出能够紧密反映生产环境数据状态变化的性能测试脚本,使测试结果更加有可信度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 7:39:30

PX4 开源飞控深度解析:从架构到二次开发(超详细)

一、引言 PX4 是目前全球最活跃、最先进的开源飞控项目之一,广泛应用于科研、工业和商业无人机领域。它以高实时性、模块化架构、强大的多传感器融合能力著称,是实现避障、精准悬停、自主飞行等功能的首选框架。 本文将从以下几个方面带你全面了解 PX4…

作者头像 李华
网站建设 2026/4/18 9:49:03

使用API运行大型语言模型Llama 3.1的技术指南

通过API运行Meta Llama 3.1 405B Llama 3.1是某中心发布的最新语言模型。它拥有高达4050亿的参数规模,在质量上可与GPT-4相媲美,并具备8000个token的上下文窗口。通过某机构的服务,只需一行代码即可在云端运行Llama 3.1。 在API游乐场中尝试L…

作者头像 李华
网站建设 2026/4/23 5:24:05

[特殊字符]️_开发效率与运行性能的平衡艺术[20260126050839]

作为一名经历过无数项目开发的工程师,我深知开发效率与运行性能之间的平衡是多么重要。在快节奏的互联网行业,我们既需要快速交付功能,又需要保证系统性能。今天我要分享的是如何在开发效率和运行性能之间找到最佳平衡点的实战经验。 &#…

作者头像 李华
网站建设 2026/4/28 0:13:50

Page Object 模式的核心价值与可维护性提升策略

在自动化测试领域,Page Object(PO)模式已成为提升代码质量的基石。它通过将页面元素和操作封装为独立对象,显著优化测试脚本的可维护性。本文将从模式原理出发,结合实践案例,详细探讨其如何解决测试代码的常…

作者头像 李华
网站建设 2026/5/1 14:49:05

CKEDITOR图片粘贴插件如何通过示例展示功能?

.NET程序员的“保姆级”CMS编辑器插件开发日记:从0到1搞定文档导入粘贴功能 咱西安.NET仔最近接了个CMS企业官网外包活,客户是做政务宣传的,需求就一句话:“新闻发布编辑器得加Word/Excel/PPT/PDF导入功能,能直接从Wo…

作者头像 李华