前言:由于通過(guò)jmeter寫的接口自動(dòng)化木有數(shù)據(jù)導(dǎo)入和統(tǒng)計(jì)分析功能,因此做了二次開發(fā),目的是讀取每條case獲取接口名稱和用例名稱,通過(guò)獲取的case執(zhí)行結(jié)果進(jìn)行計(jì)算,得到詳細(xì)接口的用例通過(guò)率存入DB,并解析出每條case的執(zhí)行結(jié)果存入DB。
流程圖如下:
由于包含case的詳細(xì)數(shù)據(jù)和接口的統(tǒng)計(jì)數(shù)據(jù),因此目前暫定2張表。
具體表結(jié)構(gòu)如下:
接口統(tǒng)計(jì)表:
用例執(zhí)行結(jié)果詳細(xì)表:
首先是如何讓jmeter生成一定格式的csv文件。那么問(wèn)題一:如何把執(zhí)行結(jié)果生成CSV文件?問(wèn)題二如何生成一定格式的CSV文件?
解決方案問(wèn)題一:
在"察看結(jié)果樹"監(jiān)聽器加入存儲(chǔ)路徑(在文件名寫入 路徑+文件名):如:
執(zhí)行jmx文件后會(huì)生成一個(gè)excResult.csv文件。如:
解決方案步驟二:
滿足一定格式是滿足如下格式:
那么如何滿足此格式呢?
在jmeter的"察看結(jié)果樹"監(jiān)聽器Configure配置下取消掉"Save As XML"
好了,到此初步的要求已經(jīng)達(dá)到。
剩下的是開發(fā)腳本,如何讀取csv文件并插入DB
代碼部分不上傳了,有興趣的同學(xué)可以私聊
上傳下如何插入DB吧、數(shù)據(jù)統(tǒng)計(jì)吧
數(shù)據(jù)統(tǒng)計(jì)代碼如下:
public static int getSucNum(String path) throws Exception{
CsvUtil util = new CsvUtil(path);
int rowNum = util.getRowNum();
int caseNum = rowNum -1;
int sucNum = 0;
List list = new ArrayList();
for(int i=1;i<rowNum;i++){
String caseName = util.getString(i, 2);
String result = util.getString(i, 7);
list.add(caseName);
list.add(result);
if(result.equals("true")==true){
sucNum +=1;
}
}
return sucNum ;
}
//計(jì)算百分比
public static String percent(int sucCaseNum, int allCseNum){
// 創(chuàng)建一個(gè)數(shù)值格式化對(duì)象
NumberFormat numberFormat = NumberFormat.getInstance();
// 設(shè)置精確到小數(shù)點(diǎn)后2位
numberFormat.setMaximumFractionDigits(2);
String result = numberFormat.format((float) sucCaseNum / (float) allCseNum * 100);
return result;
}
public static String getPryKey(String path) throws Exception{
CsvUtil util = new CsvUtil(path);
String secTitle = util.getString(1, 2);
// System.out.println("獲取檢查的接口名稱:"+secTitle);
String subTitle = secTitle.substring(2, secTitle.length());
// System.out.println("獲取接口名稱:"+subTitle);
return subTitle;
}
//獲取插入DB的接口執(zhí)行結(jié)果(通過(guò)率)
public static String getExcRate(String path) throws Exception{
CsvUtil util = new CsvUtil(path);
int rowNum = util.getRowNum();
int caseNum = rowNum -1;
int sucNum = 0;
for(int i=1;i<rowNum;i++){
String caseResult = util.getString(i, 7);
// System.out.println("用例執(zhí)行結(jié)果為:" + caseResult);
if(caseResult.equals("true")==true){
sucNum +=1;
}
}
String caseRate = CsvUtil.percent(sucNum, caseNum)+"%";
// System.out.println("用例通過(guò)率為:"+caseRate);
return caseRate;
}
//獲取插入DB的secordaryTitle&excResult(用例名稱)&(true or false)
public static void getSecKey(String path) throws Exception{
CsvUtil util = new CsvUtil(path);
int rowNum = util.getRowNum();
String caseName = null;
for(int i=1;i<rowNum;i++){
caseName = util.getString(i, 2);
// System.out.println("用例名稱為:"+caseName);
String caseResult = util.getString(i, 7);
// System.out.println("用例執(zhí)行結(jié)果為:" + caseResult);
}
}
插入DB的代碼:
//插入統(tǒng)計(jì)數(shù)據(jù)
public static boolean insertTotalDB(String primaryTitle,String excVersion,String excTerminal,String excRate,int caseTotalNum,int caseSucNum){
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 sql = "create table if NOT EXISTS AutoTest_TotalInterface(id int NOT NULL auto_increment primary key ,permaryTitle varchar(255) ,excVersion varchar(255),excTerminal varchar(255) NOT NULL DEFAULT 'App' ,excRate varchar(255) ,caseTotalNum int,caseSucNum int,creatTime timestamp NULL DEFAULT CURRENT_TIMESTAMP )";
// 創(chuàng)建數(shù)據(jù)庫(kù)中的表,
int result = stmt.executeUpdate(sql);
if (result != -1) {
sql = "insert into AutoTest_TotalInterface(permaryTitle,excVersion,excTerminal,excRate,caseTotalNum,caseSucNum) values(?,?,?,?,?,?)";
st = conn.prepareStatement(sql);
st.setString(1, primaryTitle);
st.setString(2, excVersion);
st.setString(3, excTerminal);
st.setString(4, excRate);
st.setInt(5, caseTotalNum);
st.setInt(6, caseSucNum);
st.executeUpdate();
sql = "SELECT * FROM AutoTest_TotalInterface";
System.out.println(stmt.executeQuery(sql));
ResultSet rs = stmt.executeQuery(sql);
System.out.println("id primaryTitle sexcVersion excTerminal excRate caseTotalNum caseSucNum 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;
}