数据驱动中的业务逻辑关联
概述
这种数据驱动的本质是:将测试的case,参数,url,预期结果,存储于本地excel中。运行脚本时,从文件中获取预期结果,将实际结果与预期结果比较,将实际结果,比较结果,响应状态码回写excel。
一:主干业务处理
1:需要的jar包
Apache POI 3.17
Apache POI-OOXML 3.17
Apache Commons IO 2.6
OOXML1.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将实际值与预期值进行比较,得出断言结论
2:添加一个线程组
3:添加一个用户变量
在测试计划中创建一个名为“pathToFile”的变量”。这个变量的值是我们上面创建的Excel文件的路径(注意双反斜杠)
4. 添加一个JSR223采样器,目的是根据excel文件创建一个Workbook对象
代码如下:
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; import java.io.*; XSSFWorkbook book =""; try{ InputStream inputStream = new FileInputStream(new File("${pathToFile}")); book = new XSSFWorkbook(inputStream); inputStream.close(); } catch(Exception e){ log.info("!!!!!!!!"+ e.getMessage()+"!!!!!!!!!!!!!!!"); } if(!book.equals("")){ vars.putObject("book",book); } else { SampleResult.setStopTestNow(true); }
5:添加一个While控制器
While控制器用于Excel文件包含输入数据的行数,作为发送请求的次数
在While Controller中,添加以下代码,用于停止While Controller
${__javaScript("${stopWhile}"!="OK")}
6:While控制器下添加一个计数器,用于循环计数
7:While控制器下添加一个JSR223采样器
这一步我们从excel中获取字符串,并将这些值存储在变量中
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; import java.io.*; int i = Integer.parseInt(vars.get("counter")); XSSFRow row = vars.getObject("book").getSheetAt(0).getRow(i); vars.putObject("row",row); for (int j = 1; j <= vars.getObject("book").getSheetAt(0).getRow(0).getLastCellNum(); j++) { if (row.getCell(j) == null) { row.createCell(j).setCellValue(""); } } String parameter = row.getCell(1).toString(); vars.put("parameter",parameter); String request = row.getCell(2).toString(); vars.put("request",request); String Method = row.getCell(3).toString(); vars.put("Method",Method); String expectedResult = row.getCell(5).toString(); vars.put("expectedResult",expectedResult); String Case = row.getCell(0).toString(); vars.put("Case",Case);
8:While控制器添加一个if控制器 ,用于判断excel中的方法,决定接口分支
9:IF控制器下添加http请求 ,该请求在控制器下循环读取用例(接口路径和参数)
10:http请求下循环提取响应信息 ,用于和预期值进行比较
11:http请求下添加一个BeanShell断言 ,用于比较实际结果和预期结果,并在Excel中记录响应实际值,响应状态和用例通过状态
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; //String responseToApi = SampleResult.getUrlAsString(); String requestCode = SampleResult.getResponseCode(); String responseFromApi = ("${responseMessage}"); String status = null; if (vars.get("expectedResult").equals(responseFromApi)) { status = "Passed"; } else { status = "Failed"; } //vars.getObject("row").createCell(3).setCellValue(responseToApi); vars.getObject("row").createCell(4).setCellValue(responseFromApi); vars.getObject("row").createCell(7).setCellValue(status); vars.getObject("row").createCell(6).setCellValue(ResponseCode); //vars.getObject("row").createCell(0).setCellValue("${__samplerName()}"); String stopWhile = null; int i = Integer.parseInt(vars.get("counter")); if (i >= vars.getObject("book").getSheetAt(0).getLastRowNum()) { stopWhile = "OK"; vars.put("stopWhile",stopWhile); }
12:添加JSR223采样器 ,用于回写运行结果到excel中
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; 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() + "!!!!!!!!!!!!!!!"); }
注:
1:以上所有主干业务写入excel中的sheet1!
2:从主干业务中返回主数据id和session,并保存为全局变量供支线业务调用
二:分支业务处理
1:在excel中创建新的sheet,作为分支流程的数据
2:创建一个新的线程组,写入分支业务流,修改sheet值
3:sampler中调用全局变量的主数据id,与主业务流进行关联