jmeter之数据驱动

环境说明:

jmeter版本:5.3

1.测试计划下添加变量pathToFile 并把制作好的excel文件写在这里

制作好的excel文件如下

jmeter之数据驱动_sed

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")}

然后添加计数器

jmeter之数据驱动_线程组_02

接着在计数器下添加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控制器,用于方法判断

jmeter之数据驱动_线程组_03

接着在if控制器下添加http请求

jmeter之数据驱动_apache_04

接着在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() + "!!!!!!!!!!!!!!!");
}

至此,完成所有工作,接着运行一下脚本看结果

jmeter之数据驱动_线程组_05
jmeter之数据驱动_线程组_06

完.