LoadRunner 测试 Mysql
准备文件
1. 下载 MySQL LoadRunner libraries。
下载地址:https://files.cnblogs.com/files/xiaoxitest/MySQL_LoadRunner_libraries.zip
2. 可以看到 MySQL LoadRunner libraries 里面有两个文件夹:bin 以及 include。
将 bin 文件夹里的文件拷贝到 LoadRunner 安装路径下的 bin 文件夹下。
将 include 文件夹里的文件全部拷贝到 LoadRunner 安装路径下的 include 文件夹下。
LoadRunner安装路径一般都是 C:\Program Files (x86)\HP\LoadRunner 或者 C:\Program Files \HP\LoadRunner
准备测试用的数据库
新建test数据库
在test数据库下新建表格 people:包含如下3个字段。
id需要勾选自动递增。
简单版
1. 编写 vuser_init文件
//引入mysql lib的h文件 #include "Ptt_Mysql.h" MYSQL *Mconn; vuser_init() { #define MYSQLSERVER "xx.xx.xx.xx"//mysql的ip #define MYSQLUSERNAME "root"//用户名 #define MYSQLPASSWORD "xxxxxx"//密码 #define MYSQLDB "test"//数据库 #define MYSQLPORT "3306"//端口 //引入libmysql的dll lr_load_dll("libmysql.dll"); //连接mysql Mconn = lr_mysql_connect(MYSQLSERVER, MYSQLUSERNAME, MYSQLPASSWORD, MYSQLDB, atoi(MYSQLPORT)); return 0; }
Ptt_MySql.h 这个文件是刚刚拷贝到LoadRunner的include文件夹里面的文件之一。
可以打开看到 Ptt_MySql.h 这个文件主要包含3个函数:lr_mysql_connect 、lr_mysql_query、lr_mysql_disconnect。这都是我们后边要用到的,所以拿出来放到 vuser_init() 初始化函数之前 。
然后就是定义连接数据库所需要的东西:IP、用户名、密码等。通过下面的 lr_mysql_connect()函数来连接数据库。
连接数据库前,需要加载 libmysql.dll 文件。
2. 编写action文件
Action() { char chQuery[128]; int result; //把字符存到chQuery[]中 sprintf(chQuery, "INSERT INTO people (username,password) VALUES('user11','111111')"); //执行sql result = lr_mysql_query(Mconn, chQuery); if(result == 0){ lr_output_message("insert 成功"); } else{ lr_error_message("insert 失败"); } return 0; }
这里进行的是插入操作。
数据库常见的增删改查,这里只需要把 sprintf里面的字符串替换掉就可以。
3. 编写vuser_end文件
vuser_end() { //关闭数据库连接 lr_mysql_disconnect(Mconn); return 0; }
这里就是关闭数据库连接。
复杂版
1. 编写 vuser_init文件
这里添加了一些文件是否存在的验证,以及多次连接Mysql 的尝试。
#include "Ptt_Mysql.h" #include "mysql.h" #include "mysql_com.h" #include "mysql_time.h" #include "mysql_version.h" #include "typelib.h" #include "my_list.h" #include "my_alloc.h" #define MYSQLSERVER "localhost" #define MYSQLUSERNAME "root" #define MYSQLPASSWORD "xxxxxx" #define MYSQLDB "test" #define MYSQLPORT "3306" int statu=1; MYSQL *Mconn; int conn_fail=0, conn_iter=0; vuser_init() { // Load libmysql.dll int rc; rc = lr_load_dll("libmysql.dll"); if (rc != 0) { lr_error_message("Could not load libmysql.dll"); lr_abort(); } lr_start_transaction("mysql_connection"); //Initialise MySQL if(!(Mconn = mysql_init(NULL))) { lr_message("Error -1: Cannot initialize MySQL - %s", mysql_error(Mconn)); statu = 0; lr_end_transaction("mysql_connection", LR_FAIL); } do{ // Connect to database if (!mysql_real_connect(Mconn, MYSQLSERVER, MYSQLUSERNAME, MYSQLPASSWORD, MYSQLDB, atoi(MYSQLPORT), NULL, 0)) { conn_fail = -2; conn_iter++; sleep(100); } else conn_fail = 0; } while(conn_fail < 0 && conn_iter < 10); if (conn_fail < 0) { lr_message("Error : %s", mysql_error(Mconn)); statu = 0; lr_end_transaction("mysql_connection", LR_FAIL); return -2; } else { lr_message("MySql - Good Connection"); statu = 1; lr_end_transaction("mysql_connection", LR_PASS); } return 0; }
2. 编写 Action_insert 文件
这里尝试向 people表格插入一条数据。
可以看到这里使用的数据是直接从 参数文件读取的,所以需要事先建立好参数 user 以及 pwd。
Action_insert() { if(statu) { char chQuery[1024]; int status=0; lr_start_transaction("mysql_insert"); lr_output_message("The parameter user is : %s",lr_eval_string("{user}")); lr_output_message("The parameter password is : %s",lr_eval_string("{pwd}")); sprintf(chQuery, "INSERT INTO people (username,password) VALUES('%s','%s')",lr_eval_string("{user}"),lr_eval_string("{pwd}")); status = lr_mysql_query(Mconn, chQuery); if(status!=0) { lr_end_transaction("mysql_insert",LR_FAIL ); } else { lr_end_transaction("mysql_insert", LR_PASS); } } return 0; }
3. 编写 Action_update 文件
Action_update() { if(statu) { char chQuery[1024]; int status=0; lr_start_transaction("mysql_update"); lr_output_message("The parameter user is : %s",lr_eval_string("{user}")); lr_output_message("The parameter password is : %s",lr_eval_string("{pwd}")); sprintf(chQuery,"UPDATE people SET password = '123456789' WHERE username='%s'",lr_eval_string ("{user}")); status = lr_mysql_query(Mconn, chQuery); if(status!=0) { lr_end_transaction("mysql_update",LR_FAIL ); } else { lr_end_transaction("mysql_update", LR_PASS); } } return 0; }
4. 编写 Action_select 文件
查询出来的结果保存在多维数组中,可以使用 row[][].cell 来获取数据。
Action_select() { if(statu) { char chQuery[1024]; int status=0; lr_start_transaction("mysql_select"); lr_output_message("The parameter user is : %s",lr_eval_string("{user}")); lr_output_message("The parameter password is : %s",lr_eval_string("{pwd}")); sprintf(chQuery,"SELECT username,password FROM people WHERE username='%s'",lr_eval_string("{user}")); status = lr_mysql_query(Mconn, chQuery); lr_save_string(row[0][0].cell,"user1"); lr_save_string(row[1][0].cell,"pw1"); lr_output_message(lr_eval_string("User:{user1}")); lr_output_message(lr_eval_string("Password:{pw1}")); if(status!=0) { lr_end_transaction("mysql_select",LR_FAIL ); } else { lr_end_transaction("mysql_select", LR_PASS); } } return 0; }
5. 编写 Action_delete 文件
Action_delete() { if(statu) { char chQuery[1024]; int status=0; lr_start_transaction("mysql_delete"); lr_output_message("The parameter user is : %s",lr_eval_string("{user}")); lr_output_message("The parameter password is : %s",lr_eval_string("{pwd}")); sprintf(chQuery, "DELETE FROM people WHERE username='%s'",lr_eval_string("{user}")); status = lr_mysql_query(Mconn, chQuery); if(status!=0) { lr_end_transaction("mysql_delete",LR_FAIL ); } else { lr_end_transaction("mysql_delete", LR_PASS); } } return 0; }
6. 编写 vuser_end 文件
vuser_end() { lr_mysql_disconnect(Mconn); return 0; }