通过ant-jmeter读取jtl文件拆分数据并insert DB
前言:之前详解过通过jmeter生成的csv文件,解析csv存入DB,这个有弊端
第一:需独立创建一个job
第二:需按照一定规范输出
因此,放弃解析csv方式,直接解析自动化生成的原始jtl文件并集成到ant-jmeter中,不在独立一个job而是跟项目在一起,直接在持续集成过程中insert DB。
解析jtl文件与前面介绍的javamail思路相同(若想了解 http://www.cnblogs.com/nzg-noway/p/6909821.html )
insert DB依然是2张表,详情表和统计表
Step1:具体insert操作就是jdbc链接和sql操作。如下:
注意:
1.把jdbc配置项拉取到配置文件,支持灵活可变
2.创建表结构(根据业务创建索引、唯一等)
package org.programmerplanet.ant.taskdefs.jmeter; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date; public class InsertDB { public static String currTime(){
//设置日期格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// new Date()为获取当前系统时间
String now = df.format(new Date());
return now;
} //详情数据
static public void insertDetailDB(String BuildNum,String Module,String InterfaceName,String CaseName,String Result,String databaseName,String userName, String password,String connUrl){
try {
Class.forName("com.mysql.jdbc.Driver"); // String databaseName = "AutoResult";
// String userName = "root";
// String password = "trend520";
// String connUrl = "jdbc:mysql://10.64.66.227:3306/";
Connection conn = DriverManager.getConnection(connUrl + databaseName, userName, password);
PreparedStatement st = null;
String currTime = InsertDB.currTime();
// System.out.println("当前详情入库时间:"+currTime);
Statement stmt = conn.createStatement();
// 创建数据库中的表,
String sql = "create table if NOT EXISTS Auto_Detail"
+ "(id int NOT NULL auto_increment primary key ,"
+ "BuildNum varchar(20) ,"
+ "Module varchar(100),"
+ "InterfaceName varchar(100),"
+ "CaseName varchar(100) ,"
+ "Result varchar(10),"
+ "CreateTime varchar(30) NOT NULL DEFAULT '"+currTime+"',"
+ " UNIQUE INDEX(BuildNum,Module,InterfaceName,CaseName,CreateTime))";
// System.out.println("输出sql创建表语句:"+sql);
int result = stmt.executeUpdate(sql);
if (result != -1) {
sql = "insert into Auto_Detail(BuildNum,Module,InterfaceName,CaseName,Result,CreateTime) values(?,?,?,?,?,?) "
+ "ON DUPLICATE KEY UPDATE Result=?";
st = conn.prepareStatement(sql);
st.setString(1, BuildNum);
//存入过程大写转小写
st.setString(2, Module.toLowerCase());
st.setString(3, InterfaceName.toLowerCase());
st.setString(4, CaseName.toLowerCase());
//存入执行结果true或者false转为小写
st.setString(5, Result.toLowerCase());
st.setString(6, currTime);
st.setString(7, Result.toLowerCase());
st.executeUpdate();
sql = "SELECT * FROM Auto_Detail";
// System.out.println(stmt.executeQuery(sql));
ResultSet rs = stmt.executeQuery(sql);
// System.out.println("id\tBuildNum\tModule\tInterfaceName\tCaseName\tResult\tCreatTime");
while (rs.next()) {
// System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4) + "\t" + rs.getString(5) + "\t" + rs.getString(6) + "\t" + rs.getString(7));
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
} //统计数据
static public void insertStatisticsDB(String BuildNum,String Module,int CaseNum,int FailNum,String Rate,String databaseName,String userName, String password,String connUrl){
try {
Class.forName("com.mysql.jdbc.Driver"); // String databaseName = "AutoResult";
// String userName = "root";
// String password = "trend520";
// String connUrl = "jdbc:mysql://10.64.66.227:3306/";
Connection conn = DriverManager.getConnection(connUrl + databaseName, userName, password);
PreparedStatement st = null;
String currTime = InsertDB.currTime();
// System.out.println("当前统计入库时间:"+currTime);
Statement stmt = conn.createStatement();
// 创建数据库中的表,
String sql = "create table if NOT EXISTS Auto_Statistics"
+ "(id int NOT NULL auto_increment primary key ,"
+ "BuildNum varchar(20) ,"
+ "Module varchar(100),"
+ "CaseNum int,"
+ "FailNum int ,"
+ "Rate varchar(20),"
+ "CreateTime varchar(30) NOT NULL DEFAULT '"+currTime+"',"
+ " UNIQUE INDEX(BuildNum,Module,CreateTime))";
// System.out.println("输出sql创建表语句:"+sql);
int result = stmt.executeUpdate(sql);
if (result != -1) {
sql = "insert into Auto_Statistics(BuildNum,Module,CaseNum,FailNum,Rate,CreateTime) values(?,?,?,?,?,?) "
+ "ON DUPLICATE KEY UPDATE CaseNum=?,FailNum=?,Rate=?";
// System.out.println("查看统计sql:"+sql);
st = conn.prepareStatement(sql);
st.setString(1, BuildNum);
//存入过程大写转小写
st.setString(2, Module.toLowerCase());
st.setInt(3, CaseNum);
st.setInt(4, FailNum);
st.setString(5, Rate);
st.setString(6, currTime);
st.setInt(7, CaseNum);
st.setInt(8, FailNum);
st.setString(9, Rate);
st.executeUpdate();
sql = "SELECT * FROM Auto_Statistics";
// System.out.println(stmt.executeQuery(sql));
ResultSet rs = stmt.executeQuery(sql);
// System.out.println("id\tBuildNum\tModule\tCaseNum\tFailNum\tRate\tCreatTime");
while (rs.next()) {
// System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4) + "\t" + rs.getString(5) + "\t" + rs.getString(6) + "\t" + rs.getString(7));
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args){
insertDetailDB("9.8.1001", "test", "aaa", "bbb", "true","AutoResult","root","trend520","jdbc:mysql://10.64.66.227:3306/");
}
}
step2:拆分和获取insert DB的参数
注意:
1.命名规范(满足module和interface,由于统计jdbc请求因此,module和table也可以)
2.参数拆分和获取依据
3.数据统计计算
4.由于业务方面buildNum需要,因此参数值获取时需要把buildNum丢掉
package org.programmerplanet.ant.taskdefs.jmeter; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; import javax.mail.MessagingException; import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task; public class DBTask extends Task{ private String resultLog=null;
File resultLogFile;
//
private String databaseName=null;
private String userName=null;
private String password=null;
private String connUrl=null;
/* String databaseName = "AutoResult";
String userName = "root";
String password = "xxxxxx";
String connUrl = "jdbc:mysql://10.64.66.227:3306/";*/ //jtl文件
public void setResultLog(String resultLog) {
this.resultLog = resultLog;
}
public String getResultLog() {
return resultLog;
} public void setdatabaseName(String databaseName) {
this.databaseName = databaseName;
} public String getdatabaseName() {
return databaseName;
}
public void setuserName(String userName) {
this.userName = userName;
} public String getuserName() {
return userName;
}
public void setpassword(String password) {
this.password = password;
} public String getpassword() {
return password;
}
public void setconnUrl(String connUrl) {
this.connUrl = connUrl;
} public String getconnUrl() {
return connUrl;
} /**
* @see org.apache.tools.ant.Task#execute()
* task执行的入口
*/
public void execute() throws BuildException {
System.out.println("开始执行插入数据库task");
resultLogFile = new File(System.getProperty("user.dir")+resultLog);
if (resultLogFile.exists()){
System.out.println("开始解析数据插入DBresultLog");
try {
analyseResultLog();
} catch (MessagingException e) {
e.printStackTrace();
}
}else{System.out.println("resultLog不存在,请检查!");}
} private class Entity {
int successNum=0;
int failNum=0;
} private void analyseResultLog() throws BuildException, MessagingException {
String fullTitile= null;
String BuildNum= null;
String Module= null; String InterfaceName= null;
String InterfaceName_1= null;
String CaseName= null;
String Result= null; String rate= null;
int CaseTotalNum=0;
int FailNumber=0; List<String> ModuleArray = new ArrayList<String>();
List<String> InterfaceNameArray = new ArrayList<String>();
List<String> CaseNameArray = new ArrayList<String>();
List<String> ResultArray = new ArrayList<String>(); HashMap<String,Entity> data = new HashMap<String,Entity>();
DecimalFormat df = new DecimalFormat("0.00"); try {
FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+resultLog);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
if (line.contains("<httpSample")==true||line.contains("<sample t=")==true) {
fullTitile = line.split("\"")[13];
Result = line.split("\"")[11];
ResultArray.add(Result);
//获取构建版本号
if(fullTitile.contains("BuildNum")==true){
BuildNum = fullTitile.substring(fullTitile.toLowerCase().indexOf("module")+6,fullTitile.indexOf("BuildNum")).trim();
}
if(fullTitile.toLowerCase().contains("module")==true){
Module = fullTitile.substring(0,fullTitile.toLowerCase().indexOf("module")).trim();
ModuleArray.add(Module);
if(fullTitile.toLowerCase().contains("interface")==true){
InterfaceName_1 = fullTitile.substring(fullTitile.toLowerCase().indexOf("module")+6,fullTitile.toLowerCase().indexOf("interface")).trim();
if(InterfaceName_1.contains("BuildNum")==true){
InterfaceName = InterfaceName_1.substring(InterfaceName_1.indexOf("BuildNum")+8);
}else {
InterfaceName = InterfaceName_1;
}
// System.out.println("输出接口名称:"+InterfaceName);
CaseName = fullTitile.substring(fullTitile.toLowerCase().indexOf("interface")+9).trim();
// System.out.println("输出用例名称:"+CaseName);
}else if(fullTitile.toLowerCase().contains("table")==true){
InterfaceName = fullTitile.substring(fullTitile.toLowerCase().indexOf("module")+6,fullTitile.indexOf("table")).trim();
CaseName = fullTitile.substring(fullTitile.toLowerCase().indexOf("table")+5).trim();
} InterfaceNameArray.add(InterfaceName);
CaseNameArray.add(CaseName); if(data.get(Module) == null){
Entity entity = new Entity();
if (line.indexOf(" s=\"true\"") !=-1) {
entity.successNum = 1;
}else{
entity.failNum = 1;
}
data.put(Module, entity);
}else{
Entity entity = data.get(Module);
if (line.indexOf(" s=\"true\"") !=-1) {
entity.successNum += 1;
}else{
entity.failNum += 1;
}
data.put(Module, entity);
}
}
}
}
// System.out.println("ModuleArray名称为:"+ModuleArray+ModuleArray.size());
// System.out.println("InterfaceNameArray名称为:"+InterfaceNameArray+InterfaceNameArray.size());
// System.out.println("CaseNameArray名称为:"+CaseNameArray+CaseNameArray.size());
// System.out.println("ResultArray名称为:"+ResultArray+ResultArray.size());
System.out.println("构建日期为:"+InsertDB.currTime());
System.out.println("构建版本为:"+BuildNum);
for(int i=0;i<InterfaceNameArray.size();i++){
Module=ModuleArray.get(i);
InterfaceName=InterfaceNameArray.get(i);
CaseName=CaseNameArray.get(i);
Result=ResultArray.get(i);
InsertDB.insertDetailDB(BuildNum, Module, InterfaceName, CaseName, Result,databaseName,userName,password,connUrl);
}
System.out.println("场景详情数据插入DB成功");
Iterator<String> iterator = data.keySet().iterator();
while(iterator.hasNext()){
Module = iterator.next();
Entity entity = data.get(Module);
CaseTotalNum =entity.successNum+entity.failNum;
FailNumber = entity.failNum;
if(CaseTotalNum == 0){
rate = "0";
}else {
rate = df.format((float)entity.successNum/(float)CaseTotalNum*100); }
// System.out.println("统计参数字段:版本"+BuildNum+"模块:"+Module+"用例数:"+CaseTotalNum+"失败数:"+FailNumber+"通过率:"+rate+"%");
InsertDB.insertStatisticsDB(BuildNum, Module, CaseTotalNum,FailNumber, rate+"%", databaseName,userName,password,connUrl);
}
System.out.println("场景统计数据插入DB成功");
br.close();
isr.close();
fis.close();
}catch (IOException e) {
throw new BuildException("Could not read jmeter resultLog: " + e.getMessage());
}
}
//测试
public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {
DBTask mt = new DBTask();
mt.setResultLog("/InterfaceAutoTestReport.jtl");
mt.execute(); } }
下面是我的命名规范(大家根据自己不同业务不需求进行优化和获取)
好了,开发到此结束,接下来就是在配置文件中配置jdbc
在target name增加一个insertDB
需要依赖包:mysql-jdbc放到ant的lib目录下
成果展示:
jenkins持续集成日志:
DB数据展示:
详情表:
统计表:
通过ant-jmeter读取jtl文件拆分数据并insert DB的更多相关文章
- jmeter之jtl文件解析
我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" ts=& ...
- 关于jmeter读取CSV文件的详细设置
jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...
- jmeter之jtl文件解析(生成测试报告)
我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" ts=& ...
- JTLParser-linux上jmeter的jtl文件二次分析
解析JMeter的JTL文件 2013年01月30日 ⁄ 综合 ⁄ 共 1452字 ⁄ 字号 小 中 大 ⁄ 评论关闭 http://code.google.com/p/xtoolkit/wiki ...
- Jmeter读取CSV文件,请求参数乱码
Jmeter读取CSV文件,请求参数乱码 1.修改本地配置文件,jmeter.properties,修改以下配置项 sampleresult.default.encoding=UTF-8 重启Jmet ...
- 非GUI运行Jmeter,jtl文件没有响应数据的解决办法
一.问题 Jmeter官方一直强调要在非GUI模式下运行Jmeter:Run your JMeter test in command-line non-GUI mode. 但在非GUI模式下运行生成的 ...
- jmeter遇到的问题之Windows读取jtl文件出错
问题描述 ① 使用linux运行jmeter.jmx文件后生成result.jtl文件 jmeter -n -t /tmp/jmeter.jmx -l /tmp/testresult/result.j ...
- jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)
前言:由于ant-jmeter目前的版本不支持javamail,也就是说发送邮件时只能借助jenkins自带的发送邮件插件来发送报告. 但是jenkins发送邮件支持发送邮件内容(且有价值.有营养的内 ...
- SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)
读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...
随机推荐
- Python之编写登录接口
作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 帐号文件account.txt内容如下: liuyueming 123zhangsan 123lisi 123 锁文件acc ...
- hadoop集群中删除原有jdk设置
普通用户: sudo rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64 tzdata-java-2012j-1.e ...
- Cygwin Unable to get setup from *
Cygwin Unable to get setup from * 错误 解决方案 是因为用自定义镜像站点,比如 http://mirrors.xdlinux.info/cygwin/x86_64/ ...
- 调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
Live555接收RTSP直播流,转换Http Live Streaming(iOS直播)协议 RTSP协议也是广泛使用的直播/点播流媒体协议,之前实现过一个通过live555接收RTSP协议,然后转 ...
- iframe 父子页面方法调用
在写代码的时候经常会用到将一个网页嵌入到另一个网页中,w3c也规定了一个标签<iframe>,这个标签本身就支持跨域,而且所有的浏览器都支持 iframe具有以下属性: 1.framebo ...
- MSICE界面和功能分析
一.首页 ICE实现的这种界面样式,有可能使用WCF实现的,但是MFC来模仿也是可行的. 包括配置界面,和右下角的细节. 首页的主要功能只有3个,分别为图片拼接.视频拼接和打开拼接文件. 二.输入拼接 ...
- 【Netty】UDP广播事件
一.前言 前面学习了WebSocket协议,并且通过示例讲解了WebSocket的具体使用,接着学习如何使用无连接的UDP来广播事件. 二.UDP广播事件 2.1 UDP基础 面向连接的TCP协议管理 ...
- js实现省市区三级联动
电商平台或者一些网站的个人信息部分,通常会有填写地址的功能.该功能一般分为二级联动(省.市)和三级联动(省.市.区),只需要JavaScript就可以实现. 这里介绍一种很简洁易用的方法.参考地址:h ...
- 1089 Intervals(中文)
开始前先讲几句废话:这个题我开始也没看懂,后来借助百度翻译,明白了大概是什么意思. 试题描述 输入一个n,然后输入n组数据,每个数据有两个数,代表这个闭区间是从几到几.然后看,如果任意两个闭区间有相重 ...
- 事件总线(Event Bus)知多少
源码路径:Github-EventBus 简书同步链接 1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集 ...