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条不重复的数据。