jmeter之数据驱动
环境说明:
jmeter版本:5.3
1.测试计划下添加变量pathToFile 并把制作好的excel文件写在这里
制作好的excel文件如下
2.添加线程组
在线程组下添加一个JSR223 Sampler.并添加如下代码
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFRow;
import java.io.*;//这是编写代码所必需的类的导入。类数据是从我们添加到 JMeter 的 Jar 文件中导入的
//创建数据类型为 XSSFWorkbook 的引用变量“book”。此变量将引用包含 Excel 文件中所有行的对象。最初,我们创建一个不引用任何对象的变量。换句话说,它不包含 Excel 文件中的一行
XSSFWorkbook book = "";
//旨在处理异常的块。异常是在代码执行过程中可能发生的不可预见的情况。在我们的案例中,如果我们创建的 Excel 文件在我们不知情的情况下被删除,则会出现不可预见的情况。可能发生异常的代码放在“try”块内。处理异常并通知用户这种情况的代码放置在“catch”块中。
try {
//提供对指定路径上的 Excel 文件的访问。在我们的例子中,文件的路径是我们在用户定义变量中创建的变量“${pathToFile}”
InputStream inputStream = new FileInputStream(new File("${pathToFile}"));
//创建一个 XSSFWorkbook 对象,该对象将包含 Excel 文件中的所有行。
book = new XSSFWorkbook(inputStream);
inputStream.close();//停止从文件中读取行。
} catch (Exception e) {
//log.info是一种将消息打印到 JMeter 控制台的方法。e.getMessage()是接收异常消息的方法.如果指定目录下的 Excel 文件由于某种原因不存在,则会引发异常。 e.getMessage()会收到异常信息,log.info()会在Jmeter控制台显示如下信息:“!!!!!!!!! C:\Users\CC\Desktop\ddt1.xlsx (Can找不到指定的文件)!!!!!!!!!!!!!!!"
log.info("!!!!!!!!" + e.getMessage() + "!!!!!!!!!!!!!!!");
}
//检查“book”变量是否没有引用空对象(换句话说,它检查 Excel 文件中的行是否已保存到 XSSFWorkbook 对象)。在我们的例子中,如果发生异常,可以创建一个空对象,因此不会收到 Excel 文件中的行。
if (!book.equals("")) {
vars.putObject("book", book);
} else {
//如果未收到 Excel 文件中的行,则代码 SampleResult.setStopTestNow (true) 将执行(停止测试执行)。
SampleResult.setStopTestNow(true);
}
然后再线程组下添加while控制器,并配置条件,用于循环从excel表中提取数据
${__javaScript("${stopWhile}" != "OK")}
然后添加计数器
接着在计数器下添加JSR223 Sampler用于提取每行的值
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"));
log.info("获取的计数器的值是: ************ " + "${i}" + " *************");
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++) {
// log.info("******** ***** ***** "+row.getCell(j))
// if (row.getCell(j) == null) {
// row.createCell(j).setCellValue("");
// }
// }
String casename = row.getCell(0).toString();
vars.put("casename",casename);
String parameter = row.getCell(1).toString();
vars.put("parameter",parameter);
String host = row.getCell(3).toString();
vars.put("host",host);
String path = row.getCell(4).toString();
vars.put("path",path);
String method = row.getCell(5).toString();
vars.put("method",method);
String expectedResult = row.getCell(8).toString();
vars.put("expectedResult",expectedResult);
接着添加if控制器,用于方法判断
接着在if控制器下添加http请求
接着在http请求下添加JSR223 断言
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.hssf.util.HSSFColor
String requestToApi = SampleResult.getSamplerData(); //获取 API 请求(在本例中来自 HTTPsample)并分配变量的值。
String responseFromApi = SampleResult.getResponseDataAsString();//从 API 获取响应并将值分配给变量。
String resonsehearder = SampleResult.getResponseHeaders()
String retime = SampleResult.getTime()
String status = null;//创建一个包含通过测试的结果的变量。最初分配值“null”。
//如果 API 的预期结果与实际结果相同,则设置 status = "Passed",否则设置 status = "Failed"。
if (responseFromApi.contains(vars.get("expectedResult"))) {
status = "Passed";
} else {
status = "Failed";
}
vars.getObject("row").createCell(2).setCellValue(requestToApi);//获取API请求并为变量赋值写入excel
vars.getObject("row").createCell(6).setCellValue(resonsehearder);//写入响应头
vars.getObject("row").createCell(7).setCellValue(responseFromApi);//将来自 API 的响应写入 Excel 文件中的实际结果列的单元格
vars.getObject("row").createCell(9).setCellValue(status);//在状态栏的单元格中写入通过测试的状态。
vars.getObject("row").createCell(9).setCellValue(status);//在状态栏的单元格中写入通过测试的状态。
vars.getObject("row").createCell(10).setCellValue(retime+" ms");//写入响应时间到excel
CellStyle style = vars.getObject("book").createCellStyle();
style.setVerticalAlignment(VerticalAlignment.CENTER);//设置为垂直居中
style.setWrapText(true); //设置为自动换行
vars.getObject("row").getCell(2).setCellStyle(style);
vars.getObject("row").getCell(6).setCellStyle(style);
vars.getObject("row").getCell(7).setCellStyle(style);
vars.getObject("row").getCell(9).setCellStyle(style);
//通过标记为蓝色,不通过标记为红色,并设置垂直居中
if (status == "Failed"){
CellStyle styles = vars.getObject("book").createCellStyle();
Font font = vars.getObject("book").createFont();
font.setColor(IndexedColors.RED.getIndex());
styles.setFont(font);
styles.setVerticalAlignment(VerticalAlignment.CENTER);
vars.getObject("row").getCell(9).setCellStyle(styles);
}
else{
CellStyle styles = vars.getObject("book").createCellStyle();
Font font = vars.getObject("book").createFont();
font.setColor(IndexedColors.BLUE.getIndex());
styles.setVerticalAlignment(VerticalAlignment.CENTER);
styles.setFont(font);
vars.getObject("row").getCell(9).setCellStyle(styles);
}
String stopWhile = null;
int i = Integer.parseInt(vars.get("counter"));
if (i >= vars.getObject("book").getSheetAt(0).getLastRowNum()) {
stopWhile = "OK";
vars.put("stopWhile",stopWhile);//当具有传入 API 的数据的所有行终止时,此代码将停止 While 控制器。
}
接着在线程组下添加JSR223 Sampler 用于回写数据到excel
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import java.io.*;
//由于每个 API 请求的所有结果都被写入到我们创建的“ book ”对象中,而不是实际的 Excel 文件中,所以在发送给 API 的最后一个请求之后,所有结果都会被写入一个 Excel 文件。
try {
FileOutputStream out = new FileOutputStream(new File("${pathToFile}")); //打开为编写测试结果而创建的 Excel 文件
vars.getObject("book").write(out);// 测试结果写入到文件
vars.getObject("book").close();//关闭excel文件
} catch (Exception e) {
log.info("!!!!!!!!" + e.getMessage() + "!!!!!!!!!!!!!!!");
}
至此,完成所有工作,接着运行一下脚本看结果
完.