前言:分享和規定命名規范后,各位測試人員一致認為這樣jmeter的jmx文件限制太死,主要體現六方面:
新邵ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯建站的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
第一:規定了一個jmx文件只能錄入一個接口,這樣會導致jmx文件很多
第二:導入DB的jmx文件每輪迭代都需要更換版本號,會帶來額外的工作
第三:jmx文件嚴格要求了接口執行循序,會導致大家寫好的用例會重新輸出
第四:importDB的jmx文件與接口的jmx文件對應也會很多,不能一個importDB的jmx完成所有接口的工作
第五:刪除了定義產品類型和頁面類型字段,增加了接口類型字段
第六:測試反饋終端類型、版本號、接口類型不需要通過importDB 的jmx文件傳入而是通過http請求名稱按照一定規則去獲取
因此針對上面四項不足,做了一些優化。
技術方面方面改變主要體現在:
第一:把終端類型、版本號、接口類型、接口名稱、用例數目、用例成功數目、通過率這些字段,之前只有部分(接口類型、接口名稱)是list結構,現在均改為list結構。
第二:java set操作的sql只有詳細表,而統計表是通過sql操作的(通過select詳細表計算出來統計表每個字段值insert和update的)
第三:聯合唯一索引增加了一個字段creatTime,因為測試反應按照之前聯合索引只能保留本輪迭代的數據,有之前的按照迭代保留數據,目前是按照當天保留數據(因此有之前精確到秒改為精確到日)
第四:SQL的各個字段獲取規則進行了限制
jmeter線程請求命名規則:
由于代碼做了字段獲取的規則,循環到”終端、版本、類型、校驗、接口”關鍵字時認為是本jmx文件需校驗的接口和用例
終端類型獲取規則:
由于代碼做了終端類型獲取的規則,截取”終端”和“版本”中間的字符作為終端類型
版本號獲取規則:
由于代碼做了版本號獲取的規則,截取”終端”和“版本”中間的字符作為版本號
接口類型獲取規則:
由于代碼做了接口類型獲取的規則,截取”終端”和“版本”中間的字符作為接口類型
接口名稱獲取規則:
由于代碼做了接口名稱獲取的規則,截取”校驗”和“接口”中間的字符作為接口名稱
用例名稱獲取規則:
由于代碼做了用例名稱獲取的規則,截取”接口”后面的字符作為接口名稱
具體SQL key值的取值方法如下:

//獲取符合規則的終端類型
public static ArrayList<String> getTerminalType(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
String caseAllName = null;
String TerminalType = null;
ArrayList<String> terminalTypeArray = new ArrayList<String>(); for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true
&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true
&&caseAllName.contains("接口")==true){
TerminalType = caseAllName.substring(caseAllName.indexOf("終端")+2,caseAllName.indexOf("版本"));
terminalTypeArray.add(TerminalType);
}
} return terminalTypeArray;
} //獲取符合規則的版本號
public static ArrayList<String> getVersion(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
String caseAllName = null;
String version = null;
ArrayList<String> excVersionArray = new ArrayList<String>(); for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true&&caseAllName.contains("接口")==true){
version = caseAllName.substring(caseAllName.indexOf("版本")+2,caseAllName.indexOf("類型"));
excVersionArray.add(version);
}
} return excVersionArray;
} //獲取符合規則的用例類型
public static ArrayList<String> getInterfaceType(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
String caseAllName = null;
String interfaceNameType = null;
ArrayList<String> interfaceTypeArray = new ArrayList<String>(); for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true&&caseAllName.contains("接口")==true){
interfaceNameType = caseAllName.substring(caseAllName.indexOf("類型")+2,caseAllName.indexOf("校驗"));
interfaceTypeArray.add(interfaceNameType);
}
}// System.out.println("獲取接口名稱:"+interfaceName);
return interfaceTypeArray;
} //獲取符合規則的接口名稱
public static ArrayList<String> getInterfaceName(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
String caseAllName = null;
String interfaceName = null;
ArrayList<String> interfaceNameArray = new ArrayList<String>(); for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true&&caseAllName.contains("接口")==true){
interfaceName = caseAllName.substring(caseAllName.indexOf("校驗")+2,caseAllName.indexOf("接口"));
interfaceNameArray.add(interfaceName);// System.out.println("獲取接口名稱:"+interfaceName); }
}//
return interfaceNameArray;
} //獲取符合規則的每條用例執行名稱
public static ArrayList<String> getCaseName(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
String caseAllName = null;
String caseName = null;
ArrayList<String> caseNameArray = new ArrayList<String>(); for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true&&caseAllName.contains("接口")==true){
caseName = caseAllName.substring(caseAllName.indexOf("接口")+2,caseAllName.length());// System.out.println("用例名稱為:"+caseName); caseNameArray.add(caseName);// System.out.println(caseNameArray); }
} return caseNameArray;
} //獲取符合規則的每條用例執行結果
public static ArrayList<String> getcaseIsPass(String path) throws Exception{
CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum();
ArrayList<String> caseResultArray = new ArrayList<String>();// System.out.println(CaseNum);
String caseAllName = null; for(int i=1;i<rowNum;i++){
caseAllName = util.getString(i, 2); if(caseAllName.contains("終端")&&caseAllName.contains("版本")==true&&caseAllName.contains("類型")&&caseAllName.contains("校驗")==true&&caseAllName.contains("接口")==true){
String result = util.getString(i, 7);
caseResultArray.add(result);
}
} return caseResultArray;
}
支持和兼容:
第一:支持同個jmx文件多個接口用例場景
第二:兼容同個jmx文件雖同一個接口不同順序的輸入
一個要求:
jmeter命名規則為終端AAA版本BBB類型CCC校驗DDD接口EEE
AAA為終端類型(如app、網站) ,BBB為迭代號(如9.0.1) ,CCC為接口類型(如搜索、跟團) ,DDD為接口名稱(如默認出發城市),EEE為用例名稱(如檢驗推薦城市否正確)
由于獲取SQL每個字段均為List,因此若jmeter想使用,必須進行二次封裝!!!

//封裝上面獲取終端類型、版本號、接口類型、接口名稱、方法提供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操作:
詳細表跟之前改變不大!!(索引擴充一個createTime字段、時間有精確到秒改為精確到日)
如:

public static String currTime(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設置日期格式
String now = df.format(new Date());// new Date()為獲取當前系統時間
return now;
} //插入詳細數據
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";// 已經在MySQL數據庫中創建好的數據庫。
String userName = "mobtest";// MySQL默認的root賬戶名
String password = "tuniu520";// 默認的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); // 創建數據庫中的表,
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); //存入終端類型轉為小寫
st.setString(1, terminalType.toLowerCase());
st.setString(2, excVersion);
st.setString(3, interfaceType);
st.setString(4, interfaceName);
st.setString(5, caseName); //存入執行結果true或者false轉為小寫
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\tterminalType\texcVersion\tinterfaceType\tinterfaceName\tcaseName\texcResult\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)+ rs.getString(8));
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
return false;
} return true;
}
插入統計表:(相比之前思路都改變了~是通過詳細表select計算統計后insert進去的而不是通過java依次獲取每個字段值set進去的)
具體如下:
有一點說明:就是SQL在insert的時候若是insert整個sql的時候且當唯一聯合索引鍵相同時,做更新不能用 key=vaule這種平常的用法(不然拿到第一行的數據更新了所有行的數據),而是 set key=VALUES(key)
具體用法可以看下http://www.jb51.net/article/39255.htm 這個用法,備注,因為這點糾結了我大半天時間!??!

//插入統計數據
public static boolean insertTotalDB(){ try {
Class.forName("com.mysql.jdbc.Driver");
String databaseName = "test";// 已經在MySQL數據庫中創建好的數據庫。
String userName = "mobtest";// MySQL默認的root賬戶名
String password = "tuniu520";// 默認的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 ) )";
// 創建數據庫中的表,
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); //執行插入操作
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) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4) + "\t" + rs.getString(5) + "\t" + rs.getString(6) + "\t" + rs.getString(7)+ "\t" + rs.getString(8) + rs.getString(9) );
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
return false;
} return true;
}
好了,到此結束,當然,importDB的jmx文件也要發生變化(直接調用方法即可),具體如下:

import readDB.*;import excFile.*;
String path = "D:\\excResult.csv";int length = readCsv.getTerminalTypeArray(path).size();
log.info("用例數量為:"+length);//循環獲取各個參數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("獲取版本號:"+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("獲取執行結果:"+excResultKey);
readCsv.insertDetailDB(terminalTypeKey, excVersionKey, interfaceTypeKey, interfaceNameKey, caseNameKey, excResultKey);
}//插入統計表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);
導入DB數據如下:
原始數據:
導入詳細表的數據:
導入統計表數據:
新聞名稱:jmeter導入DB數據再再優化
網站地址:http://www.yijiale78.com/article16/gddjgg.html
成都網站建設公司_創新互聯,為您提供電子商務、網站維護、手機網站建設、營銷型網站建設、做網站、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯