使用 Java 读写 JMeter 中的变量

1. 使用Java写入JMeter中的变量

1.1 需求

一个项目中有很多接口,起初保存在JMeter中配置元件->自定义变量中,如下图:

虽然有调整顺序的功能,但是量大之后,查找维护起来还是很麻烦。

1.2思路

将这些接口信息放在excel中统一管理,如果有调整,直接编辑excel表格,排序、检索方便,如下图:

1.3环境准备

JMeter:5.0
JDK:1.8
Java编辑软件:Eclipse MARS

1.4Java代码实现

1.4.1读取表格数据

现将表格中的数据读取到代码中,我这里使用的是数据保存,大家可以按照自己的习惯来写,由于使用的是jxl.jar读取excel表格,所以格式必须是xls后缀的,否则无法读取,代码如下:

/*输入流,声明读取变量is 用于读取excel表格*/	
      InputStream is=null;    
      
      /*构建Workbook对象*/
      Workbook workbook=null;   
      
      /*传入path中描述的路径,读取到is中*/
      is=new FileInputStream(path);    
      
      /*将is中读取到的excel表格赋值给workbook*/
      workbook=Workbook.getWorkbook(is);    
      
     /*声明变量sheet,将workbook中的sheet名为sheetname的表格读取到sheet中*/
      Sheet sheet=workbook.getSheet("APIList");    
      
      /*声明一个数组,用于存放sheet中的值,长度根据sheet中的实际长度定义*/
      String cases[][] = new String[sheet.getRows()][sheet.getColumns()];     
      
      /*通过两层循环,将sheet中的数据读取到数组中*/
		for(int i=0;i<sheet.getRows();i++){
			for(int j=0;j<sheet.getColumns();j++){
				
				/*声明一个单元格变量,通过getCell(j,i)得到单元格中的值,读取每列每行,getCell(j,i)前面的j是列,i是行*/
				Cell cellA1=sheet.getCell(j,i);
				
				/*如果当前单元格的格式是label(文本类型)类型的,就读取到数组中,注意:excel中所有内容需要保存成文本类型,包括数字*/
				if (cellA1.getType().equals(CellType.LABEL)){
					
					/*获取string类型单元格的数据*/
					cases[i][j]=cellA1.getContents();
					
				}
			}
		}
		//将excel表关闭
		workbook.close();    
 		//将输入流关闭
		is.close();   
	

1.4.2保存到JMeter变量中

将读取出的数组cases,循环读取到JMeter变量中,代码如下:

JMeterVariables vars = getVariables();
		 for(int i=1;i<cases.length;i++){
			vars.put(cases[i][0],cases[i][1]);	
		}

1.4.3整体代码

完整方法代码如下:

	  public void import_apilist(String path) throws IOException, BiffException{
	 
	  /*输入流,声明读取变量is 用于读取excel表格*/	
      InputStream is=null;    
      
      /*构建Workbook对象*/
      Workbook workbook=null;   
      
      /*传入filepath中描述的路径,读取到is中*/
      is=new FileInputStream(path);    
      
      /*将is中读取到的excel表格赋值给workbook*/
      workbook=Workbook.getWorkbook(is);    
      
     /*声明变量sheet,将workbook中的sheet名为sheetname的表格读取到sheet中*/
      Sheet sheet=workbook.getSheet("APIList");    
      
      /*声明一个数组,用于存放sheet中的值,长度根据sheet中的实际长度定义*/
      String cases[][] = new String[sheet.getRows()][sheet.getColumns()];     
      
      /*通过两层循环,将sheet中的数据读取到数组中*/
		for(int i=0;i<sheet.getRows();i++){
			for(int j=0;j<sheet.getColumns();j++){
				
				/*声明一个单元格变量,通过getCell(j,i)得到单元格中的值,读取每列每行,getCell(j,i)前面的j是列,i是行*/
				Cell cellA1=sheet.getCell(j,i);
				
				/*如果当前单元格的格式是label(文本类型)类型的,就读取到数组中,注意:excel中所有内容需要保存成文本类型,包括数字*/
				if (cellA1.getType().equals(CellType.LABEL)){
					
					/*获取string类型单元格的数据*/
					cases[i][j]=cellA1.getContents();
					
				}
			}
		}
		
		//将excel表关闭
		workbook.close();    
		//将输入流关闭
		is.close();    
		JMeterVariables vars = getVariables();
		for(int i=1;i<cases.length;i++){
			//表格中一共三列,name,values,description,所以只将name和value读入数组,第0列一定是name,第1列是value
			vars.put(cases[i][0],cases[i][1]);	
		}

 	 }

说明:excel表中一共三列,第一列接口名称(Name),第二列接口路径(Values),第三列接口描述(Description),格式固定好,sheet名称为:APIList。

1.4.4导出为jar包

写好后,需要导出成jar包,来提供给JMeter使用,方法如下:
右键需要导出的类名,选择Export...,选择导出路径后保存,如下图:

1.5JMeter调用

在JMeter调用时,有两种方法,一直接把所需要的jar包,放在JMeter目录中\lib\ext里面,第二是将jar包放在某个地方,在计划中添加,如下图:

这里需要导入两个包,一个读取excel的包:jxl.jar,另一个是上面代码导出的包,importAPI.jar

在调用时,添加一个BeanShell Sampler,写代码调用,代码如下:

import jmeterjar.*;
	importAPI a= new importAPI();
	a.import_apilist("E:\\work\\project\\测试\\data\\data_base.xls");

如下图:

说明:importAPI是写在jmeterjar包下面的,所以引用的时候,需要导入包中的类,这里使用了星号导入了所有类,如下图:

在查看结果树中查看结果:

到此,excel中的数据,已经导入到了JMeter中,后续请求,使用${变量名}可以调用。

2.读取JMeter中的变量,提供给Java代码使用

反过来,使用Java读取JMeter中的变量,也是提供了接口,具体实现如下:

2.1Java代码实现

	public String getJmeterV(String var){
	  JMeterVariables vars = getVariables();
	  String content = vars.get(var);
	  return content;
  	}

2.2JMeter调用

需要将JMeter中的变量名,当成字符串传入方法,如下图:

需要jar包请下载:
链接: https://pan.baidu.com/s/1BcLi56G7r12KwQR1fCoXwQ
提取码: ud2x 说明:使用Java代码,实现读取JMeter中的变量,使用这个:JMeterVariables类,jxl.jar包读取excel,压缩包中包括: importAPI.jar,jxl.jar,一个jmx示例,一个excel示例,一个说明文档
需要源码,反编译一下就行,里面没啥东西