软件国产化信创测试机构【高级参数化:如何从数据库实时读取测试数据到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")),有助于在分析结果时精确了解数据准备阶段所消耗的时间。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1219170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JPG 转 PNG 有什么用?一文讲清楚,并推荐一种更安全的在线转换方式

在日常工作和创作中,我们经常会遇到图片格式转换的问题,其中 JPG 转 PNG 是非常常见的一种需求。无论是做设计、写文档,还是开发网页,很多时候 PNG 格式都比 JPG 更合适。 这篇文章就从「为什么要把 JPG 转成 PNG」…

聊聊无锡好用的钎焊板式换热器一站式供应商有哪些

2025年工业制造领域绿色化、高效化转型加速,钎焊板式换热器作为热交换系统核心设备,其性能稳定性、定制适配性直接影响企业生产能效与成本控制。无论是冶金、食品等传统行业的工艺升级,还是医疗、暖通等细分领域的精…

granafa安装配置

1;安装:容器方式:docker pull grafana/grafana2.创建卷# create a persistent volume for your datadocker volume create grafana-storage# verify that the volume was created correctly# you should see some JS…

盘点2026年实力强的操场施工专业公司,北京凯捷体育值得关注

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为学校、企事业单位等选型提供客观依据,助力精准匹配适配的操场施工服务伙伴。 TOP1 推荐:北京凯捷体育场地设施工程有限公司 推荐指数:★★★★…

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

🚀 一键导出脚本新建一个文本文档,把下面的代码复制进去:batchecho off chcp 65001 >nul title WiFi密码导出工具 echo 正在导出所有已保存的WiFi密码... echo > WiFi密码清单.txt echo 已保存的WiFi密码清单 >> WiFi密码清单.t…

netsh wlan 常用命令速查表

1. 网络诊断与排查 netsh wlan show interfaces查看当前无线网卡的详细状态,包括信号强度、连接速度、信道和频段等。信号差时可以快速定位问题。netsh wlan show networks扫描附近所有可用的 WiFi 网络,显示它们的名称、信号强度、加密方式和信道。能帮…

【QML 入门到实战】从零开始搭建第一个 QML 界面(附完整代码)

一、QML 是什么?为什么要学 QML? QML(Qt Meta-Object Language)是 Qt 框架中用于快速构建现代、流畅、跨平台用户界面的声明式编程语言。相比传统的 Qt Widgets,QML 具有以下优势: 声明式语法&#xff1a…

【深度解析】QGroundControl (QGC) 源码结构与完整开发流程(附环境搭建 + 调试技巧)

一、QGC 是什么?为什么要学习 QGC 源码? QGroundControl(简称 QGC)是由 PX4 团队主导开发的开源地面站软件,支持 PX4、ArduPilot 等主流无人机飞控,是无人机地面站开发领域的标杆项目。 学习 QGC 源码的核…

从零实现VQE:量子态+Hamiltonian+优化器

一、项目初始化 # 创建项目结构 mkdir -p quantum_lab/{core,experiments,ui} cd quantum_lab# 创建requirements.txt cat > requirements.txt << EOF streamlit>=1.28.0 numpy>=1.24.0 scipy>=1.11.0 matplotlib>=3.7.0 pandas>=2.0.0 plotly>=5.…

ArduPilot/PX4 开源飞控架构全解析(附开发实战指引)

一、前言&#xff1a;为什么要懂飞控架构&#xff1f; ArduPilot&#xff08;APM&#xff09;和 PX4 是无人机领域最主流的两大开源飞控固件&#xff0c;覆盖消费级、工业级无人机全场景。理解它们的架构&#xff1a; 能快速定位飞控功能开发的入口&#xff0c;避免 “盲人摸…

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

一、引言 ArduPilot 是全球最成熟、最稳定、应用最广泛的开源飞控项目之一。它支持多旋翼、固定翼、无人车、无人船、水下机器人等多种载体&#xff0c;是跨载体无人系统开发的首选框架。 本文将从以下几个方面带你全面了解 ArduPilot&#xff1a; 整体架构设计代码目录结构…

CVE-2026-24617:Easy Modal 插件中的存储型XSS漏洞技术分析

CVE-2026-24617&#xff1a;Daniel Iser Easy Modal 中输入在网页生成过程中未被恰当处理&#xff08;‘跨站脚本’&#xff09;漏洞 严重性&#xff1a; 中 类型&#xff1a; 漏洞 CVE&#xff1a; CVE-2026-24617 Daniel Iser Easy Modal 插件 easy-modal 中存在“网页生成过…

AI一周重要会议和活动概览(1.26-2.1)

一、【会议通知】第43届ICML国际机器学习大会将于2026年1月28日截止投稿ICML&#xff08;International Conference on Machine Learning&#xff09;是由国际机器学习学会&#xff08;IMLS&#xff09;主办的顶级学术会议。第43届ICML国际机器学习大会将于2026年7月6日至11日在…

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

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

2026必备!8个AI论文平台,助本科生轻松搞定毕业论文!

2026必备&#xff01;8个AI论文平台&#xff0c;助本科生轻松搞定毕业论文&#xff01; AI 工具如何改变论文写作的未来 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助 AI 工具来完成毕业论文的撰写。这些工具不仅能够有效降低 AIGC&#xff08;人工智能生成…

深入解析:百度 PaddleOCR 3.0 深度测评:与 MinerU 的复杂表格识别对决

深入解析:百度 PaddleOCR 3.0 深度测评:与 MinerU 的复杂表格识别对决pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

2026 AI 新局:从大模型竞赛到数字员工,Golang 开发者的机遇与实践

引言 当我们站在 2026 年的技术起点回望&#xff0c;AI 的发展早已超越了 "实验室概念" 的范畴 —— 大模型的参数竞赛逐渐转向落地价值挖掘&#xff0c;AI 不再是辅助人类的工具&#xff0c;而是开始以 "数字员工" 的身份深度嵌入企业流程。对于 Golang …

2026 年全球 AI 演进新局:从大模型竞赛到数字员工时代的技术跃迁

引言 当 ChatGPT 的热潮逐渐沉淀为产业常态,AI 技术的发展正在从 "单点突破" 转向 "体系化渗透"。站在 2026 年的时间节点回望,我们发现人工智能已经完成了从实验室到产业场景的关键跨越:大模型不再是科技巨头的专属炫技,智能体开始成为企业数字化转型…

数字化智能场馆预订源码系统,支持多个场馆和分区设置

温馨提示&#xff1a;文末有资源获取方式 随着体育产业和共享经济的兴起&#xff0c;场馆运营需要更智能的工具来应对日益增长的需求。传统管理方式效率低、成本高&#xff0c;而数字化预订系统能显著改善这一问题。我们介绍的这款场馆预订系统源码商业运营版&#xff0c;基于T…

小米音箱只能试听?这个项目帮你畅听音乐(支持网络+本地nas等多音源方案)

文章目录 📖 介绍 📖 📒 让小米音箱畅听完整音乐的方案 📒 📝 项目简介 📝 下载安装 🔗 项目地址与下载 ⚓️ 相关链接 ⚓️ 📖 介绍 📖 小米音箱用户应该都有一个共同的痛点:播放歌曲时,经常只能听到 30 秒或 1 分钟的试听片段,完整听完一首歌成了奢望。…