您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源性能測(cè)試工具 > Jmeter
Jmeter導(dǎo)入DB數(shù)據(jù)再再優(yōu)化
作者:niuzhigang 發(fā)布時(shí)間:[ 2017/5/4 14:49:13 ] 推薦標(biāo)簽:性能測(cè)試工具 Jmeter

 

  支持和兼容:
  第一:支持同個(gè)jmx文件多個(gè)接口用例場(chǎng)景
  第二:兼容同個(gè)jmx文件雖同一個(gè)接口不同順序的輸入
  一個(gè)要求:
  jmeter命名規(guī)則為終端AAA版本BBB類型CCC校驗(yàn)DDD接口EEE
  AAA為終端類型(如app、網(wǎng)站) ,BBB為迭代號(hào)(如9.0.1) ,CCC為接口類型(如搜索、跟團(tuán)) ,DDD為接口名稱(如默認(rèn)出發(fā)城市),EEE為用例名稱(如檢驗(yàn)推薦城市否正確)
  由于獲取SQL每個(gè)字段均為L(zhǎng)ist,因此若jmeter想使用,必須進(jìn)行二次封裝!!!
//封裝上面獲取終端類型、版本號(hào)、接口類型、接口名稱、方法提供jmeter使用
public static ArrayList<String> getTerminalTypeArray(String path) throws Exception{
ArrayList<String> terminalTypeArray = readCsv.getTerminalType(path);
return terminalTypeArray;
}
public static ArrayList<String> getVersionArray(String path) throws Exception{
ArrayList<String> versionTypeArray = readCsv.getVersion(path);
return versionTypeArray;
}
public static ArrayList<String> getInterfaceTypeArray(String path) throws Exception{
ArrayList<String> interfaceTypeArray = readCsv.getInterfaceType(path);
return interfaceTypeArray;
}
public static ArrayList<String> getInterfaceNameArray(String path) throws Exception{
ArrayList<String> interfaceNameArray = readCsv.getInterfaceName(path);
return interfaceNameArray;
}
public static ArrayList<String> getCaseNameArray(String path) throws Exception{
ArrayList<String> caseNameArray = readCsv.getCaseName(path);
return caseNameArray;
}
public static ArrayList<String> getCaseIsPassArray(String path) throws Exception{
ArrayList<String> caseIsPassArray = readCsv.getcaseIsPass(path);
return caseIsPassArray;
}
  好了獲取到了,我們做插入DB操作:
  詳細(xì)表跟之前改變不大!(索引擴(kuò)充一個(gè)createTime字段、時(shí)間有精確到秒改為精確到日)
  如:
public static String currTime(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設(shè)置日期格式
String now = df.format(new Date());// new Date()為獲取當(dāng)前系統(tǒng)時(shí)間
return now;
}
//插入詳細(xì)數(shù)據(jù)
public static boolean insertDetailDB(String terminalType,String excVersion,String interfaceType,String interfaceName,String caseName,String excResult){
try {
Class.forName("com.mysql.jdbc.Driver");
String databaseName = "test";// 已經(jīng)在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建好的數(shù)據(jù)庫(kù)。
String userName = "mobtest";// MySQL默認(rèn)的root賬戶名
String password = "tuniu520";// 默認(rèn)的root賬戶密碼為空
String connUrl = "jdbc:mysql://10.10.30.200:3306/";//連接地址
Connection conn = DriverManager.getConnection(connUrl + databaseName, userName, password);
PreparedStatement st = null;
Statement stmt = conn.createStatement();
String createTime = readCsv.currTime();
String sql = "create table if NOT EXISTS AutoTest_DetailInterface(id int NOT NULL auto_increment primary key ,terminalType varchar(50) NOT  NULL DEFAULT 'App' ,"
+ "excVersion varchar(50),interfaceType varchar(50) ,interfaceName varchar(50),"
+ "caseName varchar(50) ,excResult varchar(50),creatTime varchar(50) NOT NULL DEFAULT '"+createTime+"',"
+ " UNIQUE INDEX  ( terminalType,excVersion,interfaceType,interfaceName,caseName,creatTime ) )";
//                System.out.println(sql);
// 創(chuàng)建數(shù)據(jù)庫(kù)中的表,
int result = stmt.executeUpdate(sql);
if (result != -1) {
sql = "insert into AutoTest_DetailInterface(terminalType,excVersion,interfaceType,interfaceName,caseName,excResult) values(?,?,?,?,?,?) "
+ "ON DUPLICATE KEY UPDATE excResult=?";
//                    sql = "insert into AutoTest_DetailInterface (permaryTitle,secondaryTitle,excVersion,excTerminal,excResult)
//                    +values(primaryTitle,secordaryTitle,excVersion,excTerminal,excResult)";
st = conn.prepareStatement(sql);
//存入終端類型轉(zhuǎn)為小寫
st.setString(1, terminalType.toLowerCase());
st.setString(2, excVersion);
st.setString(3, interfaceType);
st.setString(4, interfaceName);
st.setString(5, caseName);
//存入執(zhí)行結(jié)果true或者false轉(zhuǎn)為小寫
st.setString(6, excResult.toLowerCase());
st.setString(7, excResult.toLowerCase());
st.executeUpdate();
sql = "SELECT * FROM AutoTest_DetailInterface";
System.out.println(stmt.executeQuery(sql));
ResultSet rs = stmt.executeQuery(sql);
System.out.println("id terminalType excVersion interfaceType interfaceName caseName excResult creatTime");
while (rs.next()) {
System.out.println(rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + " " + rs.getString(5) + " " + rs.getString(6) + " " + rs.getString(7)+ rs.getString(8));
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
  插入統(tǒng)計(jì)表:(相比之前思路都改變了~是通過(guò)詳細(xì)表select計(jì)算統(tǒng)計(jì)后insert進(jìn)去的而不是通過(guò)java依次獲取每個(gè)字段值set進(jìn)去的)
  具體如下:
  有一點(diǎn)說(shuō)明:是SQL在insert的時(shí)候若是insert整個(gè)sql的時(shí)候且當(dāng)聯(lián)合索引鍵相同時(shí),做更新不能用 key=vaule這種平常的用法(不然拿到第一行的數(shù)據(jù)更新了所有行的數(shù)據(jù)),而是 set key=VALUES(key)
  具體用法可以看下http://www.jb51.net/article/39255.htm 這個(gè)用法,備注,因?yàn)檫@點(diǎn)糾結(jié)了我大半天時(shí)間。!
//插入統(tǒng)計(jì)數(shù)據(jù)
public static boolean insertTotalDB(){
try {
Class.forName("com.mysql.jdbc.Driver");
String databaseName = "test";// 已經(jīng)在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建好的數(shù)據(jù)庫(kù)。
String userName = "mobtest";// MySQL默認(rèn)的root賬戶名
String password = "tuniu520";// 默認(rèn)的root賬戶密碼為空
String connUrl = "jdbc:mysql://10.10.30.200:3306/";//連接地址
Connection conn = DriverManager.getConnection(connUrl + databaseName, userName, password);
PreparedStatement st = null;
Statement stmt = conn.createStatement();
String createTime = readCsv.currTime();
String sql = "create table if NOT EXISTS AutoTest_TotalInterface(id int NOT NULL auto_increment primary key ,terminalType varchar(50) NOT  NULL DEFAULT 'App' ,"
+ "excVersion varchar(50),interfaceType varchar(50) ,interfaceName varchar(50),"
+ "caseTotalNum int,caseSucNum int,excRate varchar(50) ,creatTime varchar(50) NOT NULL DEFAULT '"+createTime+"',"
+ " UNIQUE INDEX  ( terminalType,excVersion,interfaceType,interfaceName,creatTime ) )";
// 創(chuàng)建數(shù)據(jù)庫(kù)中的表,
int result = stmt.executeUpdate(sql);
if (result != -1) {
String selectSQL = "SELECT  terminalType,excVersion,interfaceType,"
+ "interfaceName,caseTotalNum,caseSucNum,"
+ "ROUND(caseSucNum/caseTotalNum,3) "
+ "as excRate,creatTime from("
+ "SELECT terminalType,excVersion,interfaceType,interfaceName,count(1) "
+ "as caseTotalNum,sum(ex) as caseSucNum,creatTime from("
+ "SELECT terminalType,excVersion,interfaceType,interfaceName,"
+ "creatTime,case excResult "
+ "when 'true' then 1 when 'false' then 0 end as ex from "
+ "AutoTest_DetailInterface)m group by "
+ "terminalType,excVersion,interfaceType,interfaceName,creatTime)n";
sql = "insert into AutoTest_TotalInterface("
+ "terminalType,excVersion,interfaceType,interfaceName,caseTotalNum,caseSucNum,"
+ "excRate,creatTime) "+selectSQL+" ON DUPLICATE KEY UPDATE caseTotalNum=VALUES(caseTotalNum),caseSucNum=VALUES(caseSucNum),excRate=VALUES(excRate)";
System.out.println(sql);
//執(zhí)行插入操作
st = conn.prepareStatement(sql);
st.executeUpdate();
sql = "SELECT * FROM AutoTest_TotalInterface";
System.out.println(stmt.executeQuery(sql));
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + " " + rs.getString(5) + " " + rs.getString(6) + " " + rs.getString(7)+ " " + rs.getString(8) + rs.getString(9) );
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
  好了,到此結(jié)束,當(dāng)然,importDB的jmx文件也要發(fā)生變化(直接調(diào)用方法即可),具體如下:
import readDB.*;
import excFile.*;
String path = "D:\excResult.csv";
int length = readCsv.getTerminalTypeArray(path).size();
log.info("用例數(shù)量為:"+length);
//循環(huán)獲取各個(gè)參數(shù)
for(int i=0;i<length;i++){
String terminalTypeKey = readCsv.getTerminalTypeArray(path).get(i);
log.info("獲取終端類型:"+terminalTypeKey);
String excVersionKey = readCsv.getVersionArray(path).get(i);
log.info("獲取版本號(hào):"+excVersionKey);
String interfaceTypeKey = readCsv.getInterfaceTypeArray(path).get(i);
log.info("獲取接口類型:"+interfaceTypeKey);
String interfaceNameKey = readCsv.getInterfaceNameArray(path).get(i);
log.info("獲取接口名稱:"+interfaceNameKey);
String caseNameKey = readCsv.getCaseNameArray(path).get(i);
log.info("獲取用例名稱:"+caseNameKey);
String excResultKey = readCsv.getCaseIsPassArray(path).get(i);
log.info("獲取執(zhí)行結(jié)果:"+excResultKey);
readCsv.insertDetailDB(terminalTypeKey, excVersionKey, interfaceTypeKey, interfaceNameKey, caseNameKey, excResultKey);
}
//插入統(tǒng)計(jì)表
readCsv.insertTotalDB();
String dir = "D:\";
String oldname = "excResult.csv";
log.info("獲取新文件名稱:"+renFile.currTime());
String newname = "excResult"+renFile.currTime()+".csv";
log.info("獲取新文件名稱:"+newname);
renFile.renameFile(dir, oldname, newname);
  導(dǎo)入DB數(shù)據(jù)如下:
  原始數(shù)據(jù):

  導(dǎo)入詳細(xì)表的數(shù)據(jù):

  導(dǎo)入統(tǒng)計(jì)表數(shù)據(jù):

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd