性能测试学习第四天-----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条不重复的数据。
性能测试学习第四天-----loadrunner:jdbc批量制造测试数据 & controller应用的更多相关文章
- 性能测试学习第四天_Loadrunner概述
1.Loadrunner的组成部分 ·脚本生成器VuGen:virtual user generator ·压力控制器Controller,License主要在这里控制 ·结果分析软件Analysis ...
- 性能测试学习 第七课 --loadrunner中JavaVuser脚本的编写
1.环境准备: LoadRunner11----->对应JDK1.6版本(32位) LoadRunner12----->对应JDK1.7版本(32位) (一).JDK下载安装完成 ...
- 性能测试学习第三天-----loadrunner接口测试&中文乱码处理
loadrunner 接口测试: get.post(3种参数格式).cookie及token处理.加密接口.webservice.socket.文件上传接口.文件下载接口 & 中 ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- MyBatis学习 之 四、MyBatis配置文件
目录(?)[-] 四MyBatis主配置文件 properties属性 settings设置 typeAliases类型别名 typeHandlers类型句柄 ObjectFactory对象工厂 pl ...
- HBase学习(四) 二级索引 rowkey设计
HBase学习(四) 一.HBase的读写流程 画出架构 1.1 HBase读流程 Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeepe ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
- 性能测试学习之三—— PV->TPS转换模型&TPS波动模型
PV->TPS转换模型 由上一篇“性能测试学习之二 ——性能测试模型(PV计算模型)“ 得知 TPS = ( (80%*总PV)/(24*60*60*(T/24)))/服务器数量 转换需要注意: ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- 简易数据分析 06 | 如何导入别人已经写好的 Web Scraper 爬虫
这是简易数据分析系列的第 6 篇文章. 上两期我们学习了如何通过 Web Scraper 批量抓取豆瓣电影 TOP250 的数据,内容都太干了,今天我们说些轻松的,讲讲 Web Scraper 如何导 ...
- iOS中基于协议的路由设计
一.背景 前段时间对我们自己的App做了结构上的重构,抛弃了之前简单的MVC开发模式,原因是随着App的业务线越来越多,单个页面的功能越来越复杂,MVC开发模式导致整个Controller-layer ...
- Java IO部分面试题
1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 1. Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 2. Byte是计算机操作数据 ...
- Spring applicationContext爆出警告“Resource leak: 'applicationContext' is never closed”
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); 此处applicationCo ...
- python面向对象-封装-property-接口-抽象-鸭子类型-03
封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...
- cookbook_类与对象
1修改实例的字符串表示 可以通过定义__str__()和__repr__()方法来实现 class Pair: def __init__(self,x,y): self.x = x self.y = ...
- springboot的邮件服务
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEA ...
- Hadoop自学系列集(四) ---- Hadoop集群
久等了,近期公司比较忙,学习的时间都没有啊,到今日才有时间呢!!!好了,下面就跟着笔者开始配置Hadoop集群吧. hosts文件和SSH免密码登录配置好了之后,现在进入Hadoop安装目录,修改一些 ...
- 入门webpack,看这篇就够了
什么是webpack? 官网给出的概念是:本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递 ...
- 对ThreadLocal的一些理解
ThreadLocal也是在面试过程中经常被问到的,本文主要从以下三个方面来谈对ThreadLocal的一些理解: ThreadLocal用在什么地方 ThreadLocal一些细节 ThreadLo ...