• 性能测试学习第四天-----loadrunner:jdbc批量制造测试数据 & controller应用


    Javavuser协议

    1.过程概述:在eclipse中用java编写sql执行脚本,复制到lr中,调整后通过参数化迭代批量制造测试数据;

    2.步骤:

      1).在eclipse中新建java project, 新建文件夹lib,将mysql-connector-java-5.1.11-bin.jar包拖到lib文件夹中,选择后右键:bulid path-add;

      2).编写脚本---select语句:

    package jdbc_select;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class jdbcSelect {
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/oa?useUnicode=true&characterEncoding=utf8";
        String sql="select * from itcast_role where name=?";
        Connection cnn;
        PreparedStatement ps;
        
        public static void main(String[] args) throws Throwable{
            jdbcSelect select = new jdbcSelect();
            select.init();
            select.action();
            select.end();
        }        
        
        public int init() throws Throwable {
            //System.out.println("envrinoment-test");
            //注册驱动,通过驱动名称加载
            Class.forName("com.mysql.jdbc.Driver");
            //通过用户名、密码、数据库url等信息和mysql建立连接,返回Connection对象
            //jdbc:mysql://dpid:3306/databasename        
            cnn = DriverManager.getConnection(url,username,password);
            System.out.println("获取的连接为:"+cnn);        
            return 0;
        }
        
        public int action() throws Throwable {
            //System.out.println("hello");
            //使用cnn对象中的预编译防范,对sql语句提前进行编译,目的是为了提升执行sql语句的性能,返回一个已经编译过的对象
            ps=cnn.prepareStatement(sql);
            //执行前,对sql参数化
            ps.setString(1,"中文");
            //执行sql语句,select操作均使用executeQuery方法,返回ResultSet类型数据,结果集对象
            ResultSet set=ps.executeQuery();        
            //指针默认位置在第一行数据之前。next()指针指向的下一行数据不为空时返回true,下一行为空时返回false
            while(set.next()){
                String name = set.getString("name");
                String description = set.getString("description");
                System.out.println("name:"+name+" description:"+description);
            }        
            return 0;
        }
    
        private char[] getArray(ResultSet set) {
            // TODO Auto-generated method stub
            return null;
        }
    
        public int end() throws Throwable {
            //关闭连接
            cnn.close();
            return 0;
        }
    }

      3).编写脚本---insert语句,有md5加密数据时,先导入md5.jar包,步骤同mysql-connector-java-5.1.11-bin.jar:

    package db;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import com.lee.util.Md5Util;
    
    public class jdbcInsert {
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/oa?useUnicode=true&characterEncoding=utf8";
        String sql="insert into itcast_role(name,description) values(?,?)";
        static String pwd=Md5Util.getMd5Hex("123456");    
        Connection cnn;
        PreparedStatement ps;
        
        public static void main(String[] args) throws Throwable {
            jdbcInsert insert=new jdbcInsert();
            System.out.println(pwd);
            insert.init();
            insert.action();
            insert.end();
        }    
        public int init() throws Throwable {
            System.out.println("envrinoment-test");
            //注册驱动,通过驱动名称加载
            Class.forName("com.mysql.jdbc.Driver");
            //通过用户名、密码、数据库url等信息和mysql建立连接,返回Connection对象
            //jdbc:mysql://dpid:3306/databasename        
            cnn = DriverManager.getConnection(url,username,password);
            System.out.println("获取的连接为:"+cnn);        
            return 0;
        }
    public int action() throws Throwable { System.out.println("hello"); //使用cnn对象中的预编译防范,对sql语句提前进行编译,目的是为了提升执行sql语句的性能,返回一个已经编译过的对象 ps=cnn.prepareStatement(sql); //执行前,对sql参数化 ps.setString(1,"firstreplace"); ps.setString(2, "secondreplace"); //执行sql语句,insert/update/delete操作均使用excuteUpdate方法 int rows=ps.executeUpdate(); System.out.println("影响的行数为:"+rows); return 0; } public int end() throws Throwable { //关闭连接 cnn.close(); return 0; } }

      4). 打开loadrunner,新建脚本---all projects--java Vuser,将脚本复制到loadrunner的action中,经过增加事务判断、参数化 处理后,综合插入、查询脚本,编写如下:

    import lrapi.lr;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import com.lee.util.Md5Util;
    import java.sql.ResultSet;
    
    public class Actions
    {
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/oa?useUnicode=true&characterEncoding=utf8";
        String sql="insert into itcast_user(loginName,password,name,phoneNumber,departmentId) values(?,?,?,?,?)";
        String sql2="SELECT    COUNT(DISTINCT(loginName)) ,COUNT(DISTINCT(phoneNumber))  FROM itcast_user";
        Connection cnn;
        PreparedStatement ps; 
        PreparedStatement ps2;
        
        public int init() throws Throwable {
        System.out.println("envrinoment-test");
        //注册驱动,通过驱动名称加载
        Class.forName("com.mysql.jdbc.Driver");
        //通过用户名、密码、数据库url等信息和mysql建立连接,返回Connection对象
        //jdbc:mysql://dpid:3306/databasename        
        cnn = DriverManager.getConnection(url,username,password);
        System.out.println("获取的连接为:"+cnn);
            //使用cnn对象中的预编译防范,对sql语句提前进行编译,目的是为了提升执行sql语句的性能,返回一个已经编译过的对象
        ps=cnn.prepareStatement(sql);
        ps2=cnn.prepareStatement(sql2);
        return 0;
        }
        
        public int action() throws Throwable {
    
        //插入MD5加密的密码数据, 这里密码也可以参数化
        String pwd=Md5Util.getMd5Hex("<num>");
        System.out.println("加密后的密码为:"+pwd);
        //执行前,对sql参数化
        ps.setString(1,"name<num>");
        ps.setString(2,pwd);
        ps.setString(3,"name<num>");
        ps.setString(4,"136<phone>");
        ps.setString(5,"<deptID>");
    
        lr.start_transaction("insert");
            
        lr.rendezvous("集合点");
    
        //执行sql语句,insert/update/delete操作均使用excuteUpdate方法
        int rows=ps.executeUpdate();
        System.out.println("影响的行数为:"+rows);
    
        if(rows>0){        
            lr.end_transaction("insert", lr.PASS);
        }else{            
            lr.end_transaction("insert", lr.FAIL);
        };
        return 0;
        }
    
        public int end() throws Throwable {    
    
        lr.start_transaction("select");
    
        //执行sql语句,select操作均使用executeQuery方法,返回ResultSet类型数据,结果集对象    
        ResultSet set = ps2.executeQuery();
    
        //仅返回一条数据时使用,打印查询结果
        if(set.next()==true){
            String count_user = set.getString("COUNT(DISTINCT(loginName))");
            String count_phone = set.getString("COUNT(DISTINCT(phoneNumber))");
            System.out.println("用户数量:"+count_user+" 手机号数量:"+count_phone);
            lr.end_transaction("select", lr.PASS);
            
        }
        else{            
            lr.end_transaction("select", lr.FAIL);
        }
        set.next();  
    
        /*
        //返回多条数据时使用
        if(set.next()==true){            
            lr.end_transaction("select", lr.PASS);
            set.beforeFirst();  // next() 每调用一次,指针后移一个位置。使用beforeFirst(),让指针回到初始位置。当仅有一条数据时,指针回到初始位置,后面循环打印才有结果输出。
        }
        else{            
            lr.end_transaction("select", lr.FAIL);
        }
    
        //指针默认位置在第一行数据之前。next()指针指向的下一行数据不为空时返回true,下一行为空时返回false。打印每次迭代的查询结果
        while(set.next()){
            String count_user = set.getString("COUNT(DISTINCT(loginName))");
            String count_phone = set.getString("COUNT(DISTINCT(phoneNumber))");
            System.out.println("用户数量:"+count_user+" 手机号数量:"+count_phone);
        }
        */
    
        //关闭连接
        cnn.close();
        return 0;
        }
    }

    5).运行调试无误后,设置参数num为唯一数,起始值100000,block为1000,超出后从最后一个值开始再次后推。点击tools--create ctroller scenario;

    6).在controller中设置并发数--虚拟用户数10,运行至全部完成。run-time-setting中设置:

    添加jar包:

    配置jdk路径:

    7).运行,即可生成10000条不重复的数据。

  • 相关阅读:
    JS的type类型为 text/template
    Vue之x-template(2)
    Vue之x-template(1)
    vue之$mount
    console.log()与console.dir()
    Less用法注意事项
    一次 Linux 系统被攻击的分析过程
    WebAR 如何改变增强现实的未来
    开发中的测试名词解释
    Flutter 同步系统的 HTTP 代理设置
  • 原文地址:https://www.cnblogs.com/qingyuu/p/11303524.html
Copyright © 2020-2023  润新知