前言:由于通过jmeter写的接口自动化木有数据导入和统计分析功能,因此做了二次开发,目的是读取每条case获取接口名称和用例名称,通过获取的case执行结果进行计算,得到详细接口的用例通过率存入DB,并解析出每条case的执行结果存入DB。
流程图如下:
由于包含case的详细数据和接口的统计数据,因此目前暂定2张表。
具体表结构如下:
接口统计表:
用例执行结果详细表:
首先是如何让jmeter生成一定格式的csv文件。那么问题一:如何把执行结果生成CSV文件?问题二如何生成一定格式的CSV文件?
解决方案问题一:
在"察看结果树"监听器加入存储路径(在文件名写入 路径+文件名):如:
执行jmx文件后会生成一个excResult.csv文件。如:
解决方案步骤二:
满足一定格式是满足如下格式:
那么如何满足此格式呢?
在jmeter的"察看结果树"监听器Configure配置下取消掉"Save As XML"
好了,到此初步的要求已经达到。
剩下的是开发脚本,如何读取csv文件并插入DB
代码部分不上传了,有兴趣的同学可以私聊
上传下如何插入DB吧、数据统计吧
数据统计代码如下:
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 ;
}
//计算百分比
public static String percent(int sucCaseNum, int allCseNum){
// 创建一个数值格式化对象
NumberFormat numberFormat = NumberFormat.getInstance();
// 设置精确到小数点后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的接口执行结果(通过率)
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("用例执行结果为:" + caseResult);
if(caseResult.equals("true")==true){
sucNum +=1;
}
}
String caseRate = CsvUtil.percent(sucNum, caseNum)+"%";
// System.out.println("用例通过率为:"+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("用例执行结果为:" + caseResult);
}
}
插入DB的代码:
//插入统计数据
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";// 已经在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 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 )";
// 创建数据库中的表,
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;
}