准备文件
1. 下载 MySQL LoadRunner libraries。
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];intresult;//把字符存到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
intrc;
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);
}elseconn_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;
}