访问初始实现路径:jmeter执行case结果插入DB生成报表和备份记录
借前面实现导入DB数据先说明之前数据的缺点:
第一,若需要依赖接口的数据,会把依赖接口的case统计进去造成数据统计错误。第二:限定了jmx文件第一条case名称必须满足设定值规范不能设置为场景名称。第三:不支持传入产品类型和页面类型。
需求优化图
根据优化图明显看出数据的处理和计算。
优化后的interfaceName获取方法:
public static String getInterfaceName(String path) throws Exception{ CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum(); String caseAllName = null; String interfaceName = null; for(int i=1;i<rowNum;i++){ caseAllName = util.getString(i, 2); if(caseAllName.contains("校验")==true){ interfaceName = caseAllName.substring(caseAllName.indexOf("验")+1,caseAllName.indexOf("接")); break; } } // System.out.println("获取接口名称:"+interfaceName); return interfaceName; }
优化后的caseName获取方法:
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("校验")==true){ caseName = caseAllName.substring(caseAllName.indexOf("口")+1,caseAllName.length()); // System.out.println("用例名称为:"+caseName); String caseResult = util.getString(i, 7); // System.out.println("用例执行结果为:" + caseResult); caseNameArray.add(caseName); // System.out.println(caseNameArray); } } return caseNameArray; }
由获取interfaceName和caseName可以看出:依赖别的接口获取入参和本验证的接口请求的名称要满足一定的命名规范!!!
第一:如果需要别的接口返回报文作为本验证接口的数据请求,那么不能含有“校验二字”,这也是若是验证的接口必须满足“校验”二字规范。
第二:校验接口的case名称必须满足“校验XXX接口”+真正的用例场景名称(如校验XXX接口检查Name,那么通过此方法运行后caseName就是“检查Name”,interfaceName就是XXX)。
既然获取case的规则变了,那么,计算case数量的方法也要改造。
由获取caseName方法执行结果可知,把满足caseName规则的用例名称存入到数组中,那么就直接通过计算数组长度来获取用例数量。
public static int getCaseNum(String path) throws Exception{ ArrayList<String> caseAllName = CsvUtil.getCaseName(path); int caseNum = caseAllName.size(); return caseNum; }
得到case数量后,接下来就是获取用例执行结果,并统计用例成功数量和计算成功率。
同样方法把用例结果也存入数组中。
public static ArrayList<String> allExcSucRate(String path) throws Exception{ CsvUtil util = new CsvUtil(path); int rowNum = util.getRowNum(); String caseAllName = null; String caseExcResult = null; ArrayList<String> caseAllExcResult = new ArrayList<String>(); for(int i=1;i<rowNum;i++){ caseAllName = util.getString(i, 2); if(caseAllName.contains("校验")==true){ caseExcResult = util.getString(i, 7); // System.out.println("用例执行结果为:" + caseExcResult); caseAllExcResult.add(caseExcResult); // System.out.println(caseNameArray); } } return caseAllExcResult; }
计算用例成功数目:
public static int caseSucNum(String path) throws Exception{ ArrayList<String> caseAllExcResult = CsvUtil.allExcSucRate(path); int CaseNum = CsvUtil.getCaseNum(path); // System.out.println(CaseNum); int caseSucNum = 0; for(int i=0;i<CaseNum;i++){ String result = caseAllExcResult.get(i); // System.out.println("用例执行结果:"+result); if (result.equalsIgnoreCase("true")==true) { caseSucNum +=1; } } return caseSucNum; }
计算用例通过率:
public static String caseSucRate(String path) throws Exception{ int CaseSucNum = CsvUtil.caseSucNum(path); int CaseNum = CsvUtil.getCaseNum(path); String caseRate = CsvUtil.percent(CaseSucNum,CaseNum)+"%"; // System.out.println("用例通过率为:"+caseRate); return caseRate; }
可以看出,以上基本完成了本次的优化需求的代码开发。
但为什么又定义了数组取值方法,看如下代码仅仅是函数的调用,为什么又做了次封装呢?
public static ArrayList<String> getCaseNameArray(String path) throws Exception{ ArrayList<String> caseNameArray = CsvUtil.getCaseName(path); return caseNameArray; } public static ArrayList<String> getCaseResultArray(String path) throws Exception{ ArrayList<String> caseResultArray = CsvUtil.allExcSucRate(path); return caseResultArray; }
为什么不在jmeterBeanshell 中直接使用呢?
ArrayList<String> caseNameArray = CsvUtil.getCaseName(path);
ArrayList<String> caseResultArray = CsvUtil.allExcSucRate(path);
因为jmeterBeashll中不支持这样使用,若使用会报错,如图:
所以,做了次封装。通过直接调用函数Benashell是不会报错的。
具体在jmeter的Beanshell中添加如下代码即可(说白了就是之前定义的方法直接应用)
import readDB.*; import excFile.*; String productType = "跟团"; String pageType = "频道页"; String excVersion = "9.1.2"; String excTerminal = "App"; String path = "D:\\excResult.csv"; String interfaceName = CsvUtil.getInterfaceName(path); log.info("获取接口名称为:"+interfaceName); int caseNum = CsvUtil.getCaseNum(path); log.info("用例数量为:"+caseNum); int caseSucNum = CsvUtil.caseSucNum(path); log.info("获取用例成功的数目:"+caseSucNum); String caseExcRate = CsvUtil.caseSucRate(path); log.info("获取用例通过率:"+caseExcRate); for(int i=0;i<caseNum;i++){ String caseName = CsvUtil.getCaseNameArray(path).get(i); log.info("获取每条用例名称:"+caseName); String caseExcResult = CsvUtil.getCaseResultArray(path).get(i); log.info("获取每条用例执行结果:"+caseExcResult); //插入详情表 CsvUtil.insertDetailDB(productType,pageType,interfaceName, caseName, excVersion,excTerminal, caseExcResult); } //插入统计表 CsvUtil.insertTotalDB(productType,pageType,interfaceName,excVersion,excTerminal, caseExcRate, caseNum, 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 表扩展了productType和pageType2个字段
这2个变量也要根据实际情况进行赋值!!!
获取数据优化前与优化后在DB明显区别如下:
举例数据:
优化前:
统计表:
详细表:
优化后:
统计表:
详细表: