三、使用Jmeter 完成数据驱动的接口测试
一、前期准备
1、需要的jar包
Apache POI 3.17 、Apache POI-OOXML 3.17 、Apache Commons IO 2.6 、OOXML模式1.3 、commons-collections4-4.1 、xmlbeans-2.6.0
2、将这些jar包放到jmeter的lib目录下,记得要在jmeter关闭的情况下放置!然后重启jmeter 。
添加jar包后,在本地jmeter目录下创建用例文件,如下所示
各字段说明:
- Case - 用例名称
- parameter- 参数值,用于生成对API的请求
- request - 在此列中,JMeter将向API写入接口路径
- Method - 在此列中,JMeter将写入请求方法
- ActualResult - 实际结果是我们接口实际返回的结果。将与预期值进行比较
- ExpectedResult-预期结果是期望从API获得的结果,手动写入
- ResponseCode 响应码是我们接口返回的响应状态
- Status Jmeter将实际值与预期值进行比较,得出断言结论
二、 执行过程
1、添加一个线程组
2、添加一个用户变量,存放用例文件路径
3、添加一个JSR223采样器,目的是根据excel文件创建一个Workbook对象
代码如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.*; InputStream inputStream = new FileInputStream(new File("${pathToFile}")); //book = new XSSFWorkbook(inputStream); //XSSF读取Excel2007;HSSF读取2003 HSSFWorkbook book = new HSSFWorkbook(inputStream); //log.info("book:"+book); try{ if(!book.equals("")){ vars.putObject("book",book); } else { SampleResult.setStopTestNow(true); } inputStream.close(); } catch(Exception e){ log.info("!!!!!!!!"+ e.getMessage()+"!!!!!!!!!!!!!!!"); }
4、添加一个while控制器,用于Excel文件包含输入数据的行数,作为发送请求的次数。在while中添加如下代码控制while控制器停止
5、While控制器下添加一个计数器,用于循环计数
6、在While控制器下添加一个JSR223采样器 用于从excel中获取字符串,并将这些值存储在变量中
代码如下:
import org.apache.poi.hssf.usermodel.*; import java.io.*; int i = Integer.parseInt(vars.get("counter")); HSSFRow row = vars.getObject("book").getSheetAt(1).getRow(i); String orderid = vars.get("orderid"); //零件ID String partid1 = vars.get("partid1"); String partid2 = vars.get("partid2"); //零件数量 String quantity1 = vars.get("quantity1"); String quantity2 = vars.get("quantity2"); vars.putObject("row",row); for (int j = 1; j <= vars.getObject("book").getSheetAt(3).getRow(0).getLastCellNum(); j++) { if (row.getCell(j) == null) { row.createCell(j).setCellValue(""); } } String parameter = row.getCell(6).toString(); parameter = parameter.replace("orderid",orderid); parameter = parameter.replace("partid1",partid1); parameter = parameter.replace("partid2",partid2); parameter = parameter.replace("quantity1",quantity1); parameter = parameter.replace("quantity2",quantity2); //print("parameter:"+parameter); vars.put("parameter",parameter); String request = row.getCell(3).toString(); //print("request:"+request); vars.put("request",request); String Method = row.getCell(5).toString(); //print("Method:"+Method); vars.put("Method",Method); String expectedResult = row.getCell(9).toString(); //print("expectedResult:"+expectedResult); vars.put("expectedResult",expectedResult); String Case = row.getCell(0).toString(); //print("Case:"+Case); vars.put("Case",Case); // String comment = row.getCell(2).toString(); // vars.put("Comment",comment);
7、在While控制器添加一个if控制器 ,用于判断excel中的方法,决定接口分支
8、在IF控制器下添加http请求 ,该请求在控制器下循环读取用例(接口路径和参数)
9、在http请求下循环提取响应信息 ,添加一个BeanShell断言 ,用于比较实际结果和预期结果,并在Excel中记录响应实际值,响应状态和用例通过状态
代码如下:
import org.apache.poi.hssf.usermodel.*; import java.io.*; String requestCode = SampleResult.getUrlAsString(); String codeFromApi = ("${code}"); String status = null; if (vars.get("expectedResult").equals(codeFromApi)) { status = "Passed"; } else { status = "Failed"; } vars.getObject("row").createCell(10).setCellValue(codeFromApi); vars.getObject("row").createCell(11).setCellValue(status); String stopWhile = null; int i = Integer.parseInt(vars.get("counter")); //int j = vars.getObject("book").getSheetAt(1).getLastRowNum(); //print("---------------------------------"); //print("i:"+i); //print("j:"+j); if (i >= vars.getObject("book").getSheetAt(3).getLastRowNum()) { stopWhile = "OK"; vars.put("stopWhile",stopWhile); }
10、添加JSR223采样器 ,用于回写运行结果到excel中
代码如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.*; try { FileOutputStream out = new FileOutputStream(new File("${pathToFile}")); vars.getObject("book").write(out); vars.getObject("book").close(); } catch (Exception e) { log.info("!!!!!!!!" + e.getMessage() + "!!!!!!!!!!!!!!!"); }
脚本结构