Jmeter(三十一)_高阶数据驱动

时间:2024-01-20 20:29:44

之前写过一篇数据驱动的文章 数据驱动测试 ,但是内容过于简单,有些关键的地方没有写明白。这两天参照了一下官方文档,重新整理了一篇数据驱动测试!

这种方法的本质是:测试的参数与预期结果,存储于本地excel中。运行脚本时,从文件中获取预期结果,最后将输入值和实际结果写入Excel。

1:创建测试之前,我们需要安装几个jar包(需要jar包的加群获取:317765580)

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

将这些jar包放到apache的lib目录下,记得要在jmeter关闭的情况下放置!然后重启jmeter

添加jar包后,在本地jmeter目录下创建一个excel文件,如下所示:

  • 测试用例描述 - 手动填写
  • 登录 - “登录”参数的值,用于形成对API的请求
  • 密码 - “密码”参数的值,用于生成对API的请求
  • 请求 - 在此列中,JMeter将向API写入请求
  • 实际结果 - 在此列中,JMeter将写入API的响应
  • 预期结果是我们期望从API获得的结果。手动填写
  • 状态 - 在此列中,JMeter将记录测试用例通过或未通过的状态

基于Excel文件,我们将执行5个测试用例。对于每个测试用例,我们预期响应都是:“{”message“:”用户登录未正确输入“}”

2:添加一个线程组

3:添加一个用户变量

线程组 - >右键单击 - >添加 - >配置元素 - > 用户定义的变量

在用户定义的变量 中创建一个名为“pathToFile”的变量  其值为“D:\\gongju\\apache-jmeter-3.2\\bin\\file\\demo.xlsx”这个变量的值是我们上面创建的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. *; 从我们添加到JMeter的Jar文件中导入所必需的类

 XSSFWorkbook book =""; 用数据类型XSSFWorkbook 创建一个参考变量“book”该变量将引用包含Excel文件中所有行的对象。

 try{}catch{}

 一个旨在处理异常的块。在代码执行过程中可能会出现一个不可预见的情况。在我们的情况下,如果我们创建的Excel文件不存在了,就可能会出现无法预料的情况。可能发生异常的代码放置在“try”块中。处理异常并通知用户这种情况的代码放置在“catch”块中

InputStream inputStream = new FileInputStream(new File("${pathToFile}"));

访问指定路径上Excel文件。文件的路径是变量"${pathToFile}",我们在用户定义的变量中创建过

InputStream inputStream = new FileInputStream() 读取Excel文件中的所有行

book = new XSSFWorkbook(inputStream); 创建一个XSSFWorkbook对象,该对象将包含Excel文件中的所有行

inputStream.close(); - 停止从文件读取

log.info("!!!!!!!!"+ e.getMessage()+"!!!!!!!!!!!!!!!")

log.info()将消息输出到JMeter控制台

e.getMessage()接收异常消息

if(!book.equals("")){

vars.putObject("book",book); 
} else {

SampleResult.setStopTestNow(true); 
}

!book.equals("") - 检查“book”变量是否未引用空对象,如果发生异常,可以创建一个空对象,并且不会接收来自Excel文件的行。

如果没有读取到Excel文件的行,则会执行代码SampleResult.setStopTestNow(true)

5. 添加一个While控制器

While控制器用于Excel文件包含输入数据的行数,作为发送请求的次数

在While Controller中,添加以下代码,用于停止While Controller

${__javaScript("${stopWhile}"!="OK")}

6:添加一个计数器,设置如下参数

7. 添加一个JSR223采样器

这一步中,我们从对象,单元格值的行中获取字符串,并将这些值存储在变量中

for(int j = 1; j <= vars.getObject(“book”)。getSheetAt(0).getRow(0).getLastCellNum(); j ++){ 
  if(row.getCell(j)== null){ 
   row .createCell(J).setCellValue(“”); 
  } 
}

for(int j = 1; j <= vars.getObject(“book”)。getSheetAt(0).getRow(0).getLastCellNum(); j ++)- 获取每个单元格。

if(row.getCell(j)== null){ 

row.createCell(j).setCellValue("");

} - 如果单元格不存在,我们创建一个单元格并将其设置为空值。

String login = row.getCell(1).toString(); - 获取行中第一个单元格的值并指定变量login的值。在我们的例子中,对第一个请求,变量“login”的值为1 

vars.put(“login”,login);

String password = row.getCell(2).toString(); - 获取行中第二个单元格的值并指定密码。在我们的例子中,对第一个请求,变量“password”的值为= 22

vars.put(“password”,password);

String expectedResult = row.getCell(5).toString(); - 获取行中第五个单元格的值并分配“expectedResult”变量的值。

vars.put(“expectedResult”,expectedResult);

8:添加虚拟采样器,用于模拟一个post请求

{"login":"${login}","password":"${password}"} 

{"message":"User login is not entered correctly"}

 

{"login":"${login}","password":"${password}"} 

{"message":"User login is not entered correctly"}

9. 添加一个BeanShell声明

用于比较实际结果和预期结果,并在Excel中记录请求,响应和状态

10. 添加一个JSR223采样器,用于将结果保存到本地的excel文件中

执行以下操作:

将每个请求的结果写入我们创建的“book”对象,而不是写入实际的Excel文件。直到在发送最后一次请求后,将所有结果都将写入Excel文件

可以看到所有的结果都写入了本地的文件,预期值写入与实际值一致,结果为pass!

看一下结构图!

加入QQ群:317765580,我们一起学习吧!