前言:分享和規(guī)定命名規(guī)范后,各位測(cè)試人員一致認(rèn)為這樣jmeter的jmx文件限制太死,主要體現(xiàn)六方面:
成都創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十年品質(zhì),值得信賴!第一:規(guī)定了一個(gè)jmx文件只能錄入一個(gè)接口,這樣會(huì)導(dǎo)致jmx文件很多
第二:導(dǎo)入DB的jmx文件每輪迭代都需要更換版本號(hào),會(huì)帶來(lái)額外的工作
第三:jmx文件嚴(yán)格要求了接口執(zhí)行循序,會(huì)導(dǎo)致大家寫(xiě)好的用例會(huì)重新輸出
第四:importDB的jmx文件與接口的jmx文件對(duì)應(yīng)也會(huì)很多,不能一個(gè)importDB的jmx完成所有接口的工作
第五:刪除了定義產(chǎn)品類型和頁(yè)面類型字段,增加了接口類型字段
第六:測(cè)試反饋終端類型、版本號(hào)、接口類型不需要通過(guò)importDB 的jmx文件傳入而是通過(guò)http請(qǐng)求名稱按照一定規(guī)則去獲取
因此針對(duì)上面四項(xiàng)不足,做了一些優(yōu)化。
技術(shù)方面方面改變主要體現(xiàn)在:
第一:把終端類型、版本號(hào)、接口類型、接口名稱、用例數(shù)目、用例成功數(shù)目、通過(guò)率這些字段,之前只有部分(接口類型、接口名稱)是list結(jié)構(gòu),現(xiàn)在均改為list結(jié)構(gòu)。
第二:java set操作的sql只有詳細(xì)表,而統(tǒng)計(jì)表是通過(guò)sql操作的(通過(guò)select詳細(xì)表計(jì)算出來(lái)統(tǒng)計(jì)表每個(gè)字段值insert和update的)
第三:聯(lián)合唯一索引增加了一個(gè)字段creatTime,因?yàn)闇y(cè)試反應(yīng)按照之前聯(lián)合索引只能保留本輪迭代的數(shù)據(jù),有之前的按照迭代保留數(shù)據(jù),目前是按照當(dāng)天保留數(shù)據(jù)(因此有之前精確到秒改為精確到日)
第四:SQL的各個(gè)字段獲取規(guī)則進(jìn)行了限制
jmeter線程請(qǐng)求命名規(guī)則:
由于代碼做了字段獲取的規(guī)則,循環(huán)到”終端、版本、類型、校驗(yàn)、接口”關(guān)鍵字時(shí)認(rèn)為是本jmx文件需校驗(yàn)的接口和用例
終端類型獲取規(guī)則:
由于代碼做了終端類型獲取的規(guī)則,截取”終端”和“版本”中間的字符作為終端類型
版本號(hào)獲取規(guī)則:
由于代碼做了版本號(hào)獲取的規(guī)則,截取”終端”和“版本”中間的字符作為版本號(hào)
接口類型獲取規(guī)則:
由于代碼做了接口類型獲取的規(guī)則,截取”終端”和“版本”中間的字符作為接口類型
接口名稱獲取規(guī)則:
由于代碼做了接口名稱獲取的規(guī)則,截取”校驗(yàn)”和“接口”中間的字符作為接口名稱
用例名稱獲取規(guī)則:
由于代碼做了用例名稱獲取的規(guī)則,截取”接口”后面的字符作為接口名稱
具體SQL key值的取值方法如下:
//獲取符合規(guī)則的終端類型 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("校驗(yàn)")==true &&caseAllName.contains("接口")==true){ TerminalType = caseAllName.substring(caseAllName.indexOf("終端")+2,caseAllName.indexOf("版本")); terminalTypeArray.add(TerminalType); } } return terminalTypeArray; } //獲取符合規(guī)則的版本號(hào) 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("校驗(yàn)")==true&&caseAllName.contains("接口")==true){ version = caseAllName.substring(caseAllName.indexOf("版本")+2,caseAllName.indexOf("類型")); excVersionArray.add(version); } } return excVersionArray; } //獲取符合規(guī)則的用例類型 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("校驗(yàn)")==true&&caseAllName.contains("接口")==true){ interfaceNameType = caseAllName.substring(caseAllName.indexOf("類型")+2,caseAllName.indexOf("校驗(yàn)")); interfaceTypeArray.add(interfaceNameType); } }// System.out.println("獲取接口名稱:"+interfaceName); return interfaceTypeArray; } //獲取符合規(guī)則的接口名稱 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("校驗(yàn)")==true&&caseAllName.contains("接口")==true){ interfaceName = caseAllName.substring(caseAllName.indexOf("校驗(yàn)")+2,caseAllName.indexOf("接口")); interfaceNameArray.add(interfaceName);// System.out.println("獲取接口名稱:"+interfaceName); } }// return interfaceNameArray; } //獲取符合規(guī)則的每條用例執(zhí)行名稱 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("校驗(yàn)")==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; } //獲取符合規(guī)則的每條用例執(zhí)行結(jié)果 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("校驗(yàn)")==true&&caseAllName.contains("接口")==true){ String result = util.getString(i, 7); caseResultArray.add(result); } } return caseResultArray; }
支持和兼容:
第一:支持同個(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)為小寫(xiě) 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)為小寫(xiě) 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; }
插入統(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) + "\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; }
好了,到此結(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ù):
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
標(biāo)題名稱:jmeter導(dǎo)入DB數(shù)據(jù)再再優(yōu)化-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://bm7419.com/article46/ijohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、做網(wǎng)站、服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、虛擬主機(jī)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容