软件国产化信创测试机构【高级参数化:如何从数据库实时读取测试数据到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(StepNameDBConnect, ConnectionStringProviderMSDASQL;DSNPerfDB;UIDtestuser;PWDtestpass;, // 使用DSN // 或使用连接字符串: ConnectionStringDriver{MySQL ODBC 8.0 Unicode Driver};Server10.0.1.100;Databasetest_db;UIDuid;PWDpwd;, ConnectionNameMyCon, // 为连接指定一个别名后续操作使用 ConnectionTypeODBC, // 连接类型可以是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(StepNameGetDynamicData, ConnectionNameMyCon, SQLStatementSELECT user_id, account_name FROM t_users WHERE status ACTIVE AND create_date SYSDATE - 1 ORDER BY user_id, DatasetNameMyDataset, // 为结果集命名 LrLastArg); // 步骤3: 获取结果集的第一行数据并将其存储到参数中。 // 获取指定列的值按列索引从1开始 lr_db_getValue(StepNameGetValue_UserId, ConnectionNameMyCon, DatasetNameMyDataset, ColumnIndex1, // 对应user_id列 OutParamParam_UserId, // 将值存入参数 Param_UserId LrLastArg); lr_db_getValue(StepNameGetValue_AccName, ConnectionNameMyCon, DatasetNameMyDataset, ColumnIndex2, // 对应account_name列 OutParamParam_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, URLhttp://api.zmtests.com/user/{Param_UserId}, MethodGET, ... 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(StepNameGetAllUsers, ConnectionNameMyCon, SQLStatementSELECT user_id FROM t_users WHERE status ACTIVE, CursorNameMyCursor, // 指定游标名 LrLastArg); // 获取游标用于遍历 lr_db_fetch(StepNameFetchNext, ConnectionNameMyCon, CursorNameMyCursor, LrLastArg); // 循环遍历游标中的每一行 while (lr_db_next_row(ConnectionNameMyCon, CursorNameMyCursor) LR_OK) { row_count; lr_db_getValue(StepNameGetCurrentUserId, ConnectionNameMyCon, CursorNameMyCursor, ColumnIndex1, OutParamCurrentUserId, // 每行的值存入同一个参数但值会更新 LrLastArg); lr_log_message(正在处理第%d行用户ID: %s, row_count, lr_eval_string({CurrentUserId})); // 使用 CurrentUserId 发起业务请求... web_custom_request(process_user, URLhttp://api.zmtests.com/process?uid{CurrentUserId}, MethodPOST, LAST); } lr_log_message(总共处理了 %d 行数据。, row_count); // 关闭游标释放资源重要 lr_db_close_cursor(ConnectionNameMyCon, CursorNameMyCursor); return 0; }文章来源卓码软件测评精彩推荐点击蓝字即可▲软件负载测试▲API自动化测试▲软件测试▲第三方软件测试▲软件性能测试▲软件测试机构步骤四在vuser_end中关闭数据库连接vuser_end() { lr_db_disconnect(StepNameDBDisconnect, ConnectionNameMyCon, LrLastArg); lr_log_message(数据库连接已关闭。); return 0; }3. 注意事项连接池和性能在vuser_init中建立的连接是该虚拟用户的专有连接。在情形中大量虚拟用户同时建立连接会对数据库造成压力需保证数据库能承受此连接数。错误处理必须检查每个数据库函数的返回值。使用lr_db_last_error函数在失败时获取详细错误信息并记录到日志。SQL优化保证执行的SQL语句本身是高效的避免在性能测试脚本中引入全表扫描等慢查询。参数唯一性当使用游标遍历时如果需要在同一迭代中多次使用同一行的不同列需及时将值保存到不同的参数中因为lr_db_next_row会使游标前进。事务划分将数据库查询操作本身包含在一个独立的事务中如lr_start_transaction(sql_query)有助于在分析结果时精确了解数据准备阶段所消耗的时间。通过以上高级参数化技术可以创建出能够紧密反映生产环境数据状态变化的性能测试脚本使测试结果更加有可信度。

相关新闻

时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?

时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?

2026/7/11 6:20:53 阅读更多 →
一键导出所有 WiFi 密码批处理脚本

一键导出所有 WiFi 密码批处理脚本

2026/7/8 5:38:30 阅读更多 →
netsh wlan 常用命令速查表

netsh wlan 常用命令速查表

2026/7/10 22:56:44 阅读更多 →

最新新闻

工业级光耦FOD4216与PIC18F25K42的抗干扰设计实践

工业级光耦FOD4216与PIC18F25K42的抗干扰设计实践

1. 工业环境信号传输的挑战与解决方案概述在电机控制、PLC系统等工业场景中,电磁干扰(EMI)和射频干扰(RFI)如同无形的噪音污染源。我曾参与过一个纺织厂自动化改造项目,当变频器启动时,原本稳定…

2026/7/11 6:24:46 阅读更多 →
前端加密实战:避开Crypto-JS与JSEncrypt的常见陷阱

前端加密实战:避开Crypto-JS与JSEncrypt的常见陷阱

1. 项目概述:前端加密的“安全感”与“陷阱”在前后端分离架构成为主流的今天,前端加密几乎成了保护敏感数据(如登录凭证、支付信息、个人隐私)传输的标配动作。无论是使用Crypto-JS进行哈希或对称加密,还是用JSEncryp…

2026/7/11 6:24:46 阅读更多 →
3步解密DRM视频:Video Decrypter让您轻松保存流媒体内容

3步解密DRM视频:Video Decrypter让您轻松保存流媒体内容

3步解密DRM视频:Video Decrypter让您轻松保存流媒体内容 【免费下载链接】video_decrypter Decrypt video from a streaming site with MPEG-DASH Widevine DRM encryption. 项目地址: https://gitcode.com/gh_mirrors/vi/video_decrypter 还在为无法下载喜爱…

2026/7/11 6:20:44 阅读更多 →
C++后端服务与Nginx网关集成实战:架构设计与性能优化

C++后端服务与Nginx网关集成实战:架构设计与性能优化

1. 项目概述:当C后端遇上Nginx网关最近在带几个新人做项目复盘,发现一个挺有意思的现象:很多学了C的朋友,一提到要写个能对外提供服务的网络程序,第一反应就是去啃Socket编程,自己从零开始搭TCP服务器、处理…

2026/7/11 6:18:43 阅读更多 →
AI开发环境配置全攻略:Claude API连接、NVIDIA驱动与腾讯云集成

AI开发环境配置全攻略:Claude API连接、NVIDIA驱动与腾讯云集成

最近在AI开发领域,不少开发者遇到了各种环境配置和API连接问题,特别是使用Anthropic Claude、腾讯云服务以及NVIDIA显卡驱动时频繁出现连接失败和驱动兼容性错误。本文将围绕这些高频问题,提供完整的解决方案和实战指南,涵盖从环境…

2026/7/11 6:16:43 阅读更多 →
Verilog 单bit CDC 脉冲同步:从异或展宽到握手协议的2种RTL实现与仿真对比

Verilog 单bit CDC 脉冲同步:从异或展宽到握手协议的2种RTL实现与仿真对比

Verilog单bit跨时钟域脉冲同步:异或展宽与握手协议的深度对比在数字IC设计中,跨时钟域(CDC)信号处理是每个工程师必须掌握的核心技能。当信号需要从一个时钟域传递到另一个时钟域时,特别是当源时钟频率高于目标时钟频率…

2026/7/11 6:16:43 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻