2026/2/22 2:47:17
网站建设
项目流程
建立一个网站需要人员,页面设计的突出主体原则,如何免费建com的网站,网站怎么做显得简洁美观性能测试使用静态参数文件往往无法模拟真实情形的动态性#xff0c;尤其是当测试数据需要和当前数据库状态保持实时一致时。LoadRunner通过强大的数据库查询功能#xff0c;支持在脚本运行时直接从数据库实时获取数据#xff0c;实现真正动态的参数化。 根据LoadRunner 12.5…性能测试使用静态参数文件往往无法模拟真实情形的动态性尤其是当测试数据需要和当前数据库状态保持实时一致时。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)有助于在分析结果时精确了解数据准备阶段所消耗的时间。通过以上高级参数化技术可以创建出能够紧密反映生产环境数据状态变化的性能测试脚本使测试结果更加有可信度。