前言:之前详解过通过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的更多相关文章

  1. jmeter之jtl文件解析

    我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" ts=& ...

  2. 关于jmeter读取CSV文件的详细设置

    jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...

  3. jmeter之jtl文件解析(生成测试报告)

    我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" ts=& ...

  4. JTLParser-linux上jmeter的jtl文件二次分析

    解析JMeter的JTL文件 2013年01月30日 ⁄ 综合 ⁄ 共 1452字 ⁄ 字号 小 中 大 ⁄ 评论关闭   http://code.google.com/p/xtoolkit/wiki ...

  5. Jmeter读取CSV文件,请求参数乱码

    Jmeter读取CSV文件,请求参数乱码 1.修改本地配置文件,jmeter.properties,修改以下配置项 sampleresult.default.encoding=UTF-8 重启Jmet ...

  6. 非GUI运行Jmeter,jtl文件没有响应数据的解决办法

    一.问题 Jmeter官方一直强调要在非GUI模式下运行Jmeter:Run your JMeter test in command-line non-GUI mode. 但在非GUI模式下运行生成的 ...

  7. jmeter遇到的问题之Windows读取jtl文件出错

    问题描述 ① 使用linux运行jmeter.jmx文件后生成result.jtl文件 jmeter -n -t /tmp/jmeter.jmx -l /tmp/testresult/result.j ...

  8. jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)

    前言:由于ant-jmeter目前的版本不支持javamail,也就是说发送邮件时只能借助jenkins自带的发送邮件插件来发送报告. 但是jenkins发送邮件支持发送邮件内容(且有价值.有营养的内 ...

  9. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

随机推荐

  1. JS立即执行函数表达式(IIFE)

    原文为 http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife ----------------- ...

  2. 从源码来理解slf4j的绑定,以及logback对配置文件的加载

    项目中的日志系统使用的是slf4j + logback.slf4j作为一个简单日志门面,为各种loging APIs(像java.util.logging, logback, log4j)提供一个简单 ...

  3. ZooKeeper安装、部署

    一.简介       ZK的安装和配置十分简单,既可以配置成单机模式,也可以配置成集群模式,zk使用java编写的运行在java环境上,3个ZK服务进程是建议的最小进程数量,而且建议部署在不通的物理机 ...

  4. 基于spark和sparkstreaming的word2vec

    概述 Word2vec是一款由谷歌发布开源的自然语言处理算法,其目的是把words转换成vectors,从而可以用数学的方法来分析words之间的关系.Spark其该算法进行了封装,并在mllib中实 ...

  5. .Net Core 连输入中文都变坑了...

    前不久Core诞生时候,那个时候我也在项目上没时间去尝那青涩的味道.今天刚刚装上2017就等不及的试了一下. 先创建了一个控制台的应用程序,然后在Main()方法中写了几句话,就等不及的Ctrl+F5 ...

  6. [Angularjs]$http.post与$.post

    摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下. 一个例子 这里模拟登录的一个场 ...

  7. 关于MySQL数据库的一些操作

    启动:net start MySQL 关闭:net stop MySQL (也可以用quit:) 登录到MySQL:mysql -u root -p -u : 所要登录的用户名; -p : 告诉服务器 ...

  8. Android stdio打开特定网页

    博主懒不想打字,直接上程序 package com.example.testopen;   import android.app.Activity; import android.os.Bundle; ...

  9. 纯css实现多标签浮动居中(任意个数)

    在做的一个网页上有一块要用浮动标签,具体就是网页底部有未知数量,未知尺寸的元素要水平居中,有点类似于分页器. 首先,我们先新建一个容器con,就是标签的爸爸,用来控制标签在页面的位置,.father{ ...

  10. centos7搭建SVN+Apache+IF.svnadmin实现web管理SVN

    阅读目录 1. 介绍 2. 软件准备 3. 建立SVN Server仓库 4. 配置安装PHP&IF.SVNadmin 5. 启动服务 1.介绍 公司最近想把Windows server平台的 ...