zoukankan      html  css  js  c++  java
  • LoadRunner 测试 Mysql

    准备文件

    1. 下载 MySQL LoadRunner libraries。

    下载地址:http://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)HPLoadRunner 或者 C:Program Files HPLoadRunner

    准备测试用的数据库

    新建test数据库

    在test数据库下新建表格 people:包含如下3个字段。

    id需要勾选自动递增。

    image

    简单版

    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;
    }
  • 相关阅读:
    深入浅出Vue基于“依赖收集”的响应式原理(转)
    10道初级渗透测试面试题,测测你离职场有多远?
    CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞
    CTF必备技能丨Linux Pwn入门教程——利用漏洞获取libc
    CTF必备技能丨Linux Pwn入门教程——调整栈帧的技巧
    CTF必备技能丨Linux Pwn入门教程——ROP技术(下)
    用实力燃爆暑期丨i春秋渗透测试工程师线下就业班开课了!
    CTF必备技能丨Linux Pwn入门教程——ROP技术(上)
    CTF必备技能丨Linux Pwn入门教程——ShellCode
    CTF必备技能丨Linux Pwn入门教程——栈溢出基础
  • 原文地址:https://www.cnblogs.com/miniren/p/7151224.html
Copyright © 2011-2022 走看看