這種數據驅動的本質是:將測試的case,參數,url,預期結果,存儲於本地excel中。運行腳本時,從文件中獲取預期結果,將實際結果與預期結果比較,將實際結果,比較結果,響應狀態碼回寫excel。
一:主干業務處理
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將實際值與預期值進行比較,得出斷言結論
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() + "!!!!!!!!!!!!!!!");
}

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,與主業務流進行關聯

