有2點說明:讀取csv文件亂碼問題和讀取關閉文件(因為結束后會有備份歷史記錄,因此必須關閉CSV文件)
亂碼問題解決方案不要用FileReader而是InputStreamReader可以指定讀取編碼
public CsvUtil(String fileName) throws Exception {
this.fileName = fileName;
//FileReader可能會根據不同的環境造成從CSV讀取時亂碼
br = new BufferedReader(new FileReader(fileName));
//解決亂碼
br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"utf-8"));
String stemp;
while ((stemp = br.readLine()) != null) {
list.add(stemp);
}
//關閉csv文件
br.close();
}
代碼開發基本完成,差數據備份了,數據備份的代碼如下:
package excFile;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class renFile {
public static boolean renameFile(String path,String oldname,String newname){
File file=new File(path+oldname);
if(file.exists())
{
file.renameTo(new File(path+newname));
return true;
}
return false;
}
public static String currTime(){
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//設置日期格式
String now = df.format(new Date());// new Date()為獲取當前系統時間
return now;
}
public static void main(String[] args) {
String path = "d:\";
String oldname = "excResult.csv";
String newname = "excResult"+renFile.currTime()+".csv";
System.out.println("獲取當前時間:"+renFile.currTime());
System.out.println("獲取新的名稱:"+renFile.renameFile(path, oldname, newname));
}
}
恭喜,代碼開發基本結束,那么如何被jmeter引用?
把開發的代碼export為jar包
如導出jar包名為excDB.jar
由于插入DB要有jdbc依賴包。(mysql-jdbc.jar)
導出后,把2個jar放到jmeter的lib/ext目錄下,重啟jmeter 即可引用。
如下:在jmeter的beanshell(取樣器)工具中寫入調用函數腳本即可
import readDB.*;
import excFile.*;
String excVersion = "9.1.2";
String excTerminal = "App";
String path = "D:\excResult.csv";
String primaryTitle = CsvUtil.getPryKey(path);
log.info("獲取接口名稱:"+primaryTitle);
String excRate = CsvUtil.getExcRate(path);
log.info("獲取單個接口用例通過率:"+excRate);
CsvUtil util = new CsvUtil(path);
int rowNum = util.getRowNum();
//log.info("獲取行數:"+rowNum);
int caseTotalNum = rowNum -1;
log.info("獲取用例總數:"+caseTotalNum);
int caseSucNum = CsvUtil.getSucNum(path);
log.info("獲取用例通過數量:"+caseSucNum);
for(int i=1;i<rowNum;i++){
String secordaryTitle = util.getString(i, 2);
log.info("獲取用例名稱:"+secordaryTitle);
String excResult = util.getString(i, 7);
log.info("獲取用例執行結果:"+excResult);
//執行insertDB---詳細數據
CsvUtil.insertDetailDB(primaryTitle, secordaryTitle, excVersion, excTerminal, excResult);
}
////執行insertDB---統計數據
CsvUtil.insertTotalDB(primaryTitle, excVersion, excTerminal, excRate, caseTotalNum, caseSucNum);
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的jmx文件腳本有幾個變量強調下:
①excVersion---版本號(如9.1.0)
②excTerminal---終端類型(如App、網站、M站)
③path---csv文件路徑(如d:excResult.csv)
④dir---csv在哪個目錄下(如d:)
⑤oldname---csv文件名(如excResult.csv)
其中import這2個包名要準確,是你在開發這些class文件時創建的包名
import readDB.*;
import excFile.*;
如:

這樣會把存入DB的jmx文件和用例的jmx文件放在一個文件夾下執行,執行循序會根據jmx文件修改時間的正序來執行,因此一定要確保執行case的jmx文件時間要在導入DB的jmx文件前面。
當然也可以把所有按照接口生成的的jmx文件和分別導入DB的jmx文件放在一個文件夾下,但必須渠道入到的CSV文件名不相同,每個對應讀取CSV導入DB的jmx文件的指向路徑也不同。
基本完成,執行結果如上面的導入DB的數據一樣。
這樣整個開發到此結束!!!
還有是接口名稱和用例名稱命名規范的問題!
有2個要求:
第一個要求:由于代碼做了接口名稱獲取的規則,是獲取第一條接口case名稱但不是單純的獲取,是截斷了前面2個字符,后面所有字符作為接口名稱。
因此要求case輸出者在輸出接口自動化時第一條case名稱命名為“校驗XXXX接口”!!這樣根據截斷規存入DB的接口名稱為“XXXX接口”,才符合接口名稱命名規范。
第二個要求:jmx文件,一個接口自動化場景輸出一個jmx文件,不要在此jmx文件上輸出其它的接口case,在這個接口的基礎上輸出不同場景的case。
否則會把不同接口統計到一個接口中去!
備份的歷史記錄文件如下:(原文件名+時間戳)。
為什么要renName?
一方面:也是renName的根本原因,因為每次執行的CSV文件,如果在執行接口自動化的jmx文件前不刪除,會把本次的執行結果追加到原csv文件!!!
另一方面:保存歷史記錄。