有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文件!!!
另一方面:保存历史记录。