news 2026/5/11 4:19:39

软件国产化信创测试机构【高级参数化:如何从数据库实时读取测试数据到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/5/10 17:32:38

前后端分离疫苗发布和接种预约系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展,疫苗接种管理系统的数字化和智能化已成为公共卫生领域的重要需求。传统的疫苗预约和接种管理方式存在效率低下、信息不透明、数据管理混乱等问题,难以满足大规模疫苗接种的需求。尤其是在突发公共卫生事件中,高效…

作者头像 李华
网站建设 2026/5/1 23:34:59

保险行业Vue大文件组件上传DEMO?

网工大三党文件上传救星:原生JS实现10G大文件上传(Vue3IE8兼容) 兄弟,作为刚入坑网络工程的山西老狗,我太懂你现在的处境了——老师要10G大文件上传的毕业设计,网上找的代码全是“断头路”,后端…

作者头像 李华
网站建设 2026/5/7 0:12:38

Vue大文件上传原理及DEMO分享?

一个大三仔的编程血泪史:大文件上传系统开发实录 前言 各位老铁们好,我是广西某不知名大学网络工程专业的大三学生,最近被导师逼着做一个"支持10G文件上传、断点续传、文件夹层级保留、全浏览器兼容、还要加密传输存储"的变态文件…

作者头像 李华
网站建设 2026/5/3 13:46:01

如何快速完成数学建模论文复现?10款AI工具为你助力

数学建模论文的复现与排版往往时间紧迫、任务繁重,但借助AI工具可以显著提升效率。通过对10款热门AI论文写作工具的评测,发现部分工具能自动优化公式排版、生成代码框架,甚至辅助模型复现,尤其适合需要快速完成高质量论文的场景。…

作者头像 李华
网站建设 2026/5/2 11:08:11

HoRain云--Redis超时排查全攻略

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/1 16:34:42

智能技术加持软件工程毕设:8款AI应用加速论文与编程流程

文章总结表格(工具排名对比) 工具名称 核心优势 aibiye 精准降AIGC率检测,适配知网/维普等平台 aicheck 专注文本AI痕迹识别,优化人类表达风格 askpaper 快速降AI痕迹,保留学术规范 秒篇 高效处理混AIGC内容&…

作者头像 李华