通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例

本文主要是介绍通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例
继上一篇mysql数据库性能测试三种实现方法,另外一种常规通用的方法
loadrunner和mysql安装配置省略,下面是脚本实例
/*需要的表结构如下 
CREATE TABLE `test_data` ( `order_id` BIGINT UNSIGNED NOT NULL COMMENT 'Order ,numbers. Must be unique.', `status` BOOL NOT NULL DEFAULT '0' COMMENT 'Whether data has been used or not. A value of 0 means FALSE.', `date_used` DATETIME NULL COMMENT 'Date/time that the data was used.', UNIQUE ( `order_id` ) 
) ENGINE = innodb COMMENT = 'LoadRunner test data'; 
*/  
Action()  
{  int rc;   int db_connection; // <a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库" target='_blank' style='color:#df3434; font-weight:bold;'>数据库</a>连接  int query_result; // 查询结果集 MYSQL_RES  char** result_row; // 查询的数据衕  char *server = "localhost";  char *user = "root";  char *password = "123456";  char *database = "test";  int port = 3306;  int unix_socket = NULL;   int flags = 0;   // 找到libmysql.dll的所在位置.  rc = lr_load_dll("C://Program Files//<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库" target='_blank' style='color:#df3434; font-weight:bold;'>mysql</a>//MySQL Server 5.1//bin//libmysql.dll");  if (rc != 0) {  lr_error_message("Could not load libmysql.dll");  lr_abort();  }  // 创建MySQL对象  db_connection = mysql_init(NULL);  if (db_connection == NULL) {  lr_error_message("Insufficient memory");  lr_abort();  }  // 连接到MySQL数据库  rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);  if (rc == NULL) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  // 向数据库插入数据  // 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替  lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");   rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  // 从数据库读取一个数据并显示  rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  query_result = mysql_use_result(db_connection);  if (query_result == NULL) {  lr_error_message("%s", mysql_error(db_connection));  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  // 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL  result_row = (char **)mysql_fetch_row(query_result);   if (result_row == NULL) {  lr_error_message("Did not expect the result set to be empty");  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  // 保存参数,用于删除这行数据  lr_save_string(result_row[0], "paramOrderID");  lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));  mysql_free_result(query_result);  // 在事务里更新一行数据,需要用InnoDB引擎  rc = mysql_query(db_connection, "BEGIN"); //启动事务  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  // 使用 "FOR UPDATE" 锁住要更新的数据行  rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");   if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  query_result = mysql_use_result(db_connection);  if (query_result == NULL) {  lr_error_message("%s", mysql_error(db_connection));  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  result_row = (char **)mysql_fetch_row(query_result);   if (result_row == NULL) {  lr_error_message("没有查询到结果");  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  lr_save_string(result_row[0], "paramOrderID");  lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));  mysql_free_result(query_result);  lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");  rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  rc = mysql_query(db_connection, "COMMIT"); // 提交事务  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  // 再次查找数据,应该为空了,因为前面的事务更新了标志  rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  query_result = mysql_use_result(db_connection);  if (query_result == NULL) {  lr_error_message("%s", mysql_error(db_connection));  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  result_row = (char **)mysql_fetch_row(query_result);  if (result_row == NULL) {  lr_output_message("Result set is empty as expected");  mysql_free_result(query_result);  } else {  lr_error_message("Did not expect the result set to contain any rows");  mysql_free_result(query_result);  mysql_close(db_connection);  lr_abort();  }  // 删除数据  lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");  rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));  if (rc != 0) {  lr_error_message("%s", mysql_error(db_connection));  mysql_close(db_connection);  lr_abort();  }  // 释放MySQL资源  mysql_close(db_connection);  return 0;  
}  


这篇关于通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847190

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比