之前写过一篇数据驱动的文章 数据驱动测试 ,但是内容过于简单,有些关键的地方没有写明白。这两天参照了一下官方文档,重新整理了一篇数据驱动测试!
这种方法的本质是:测试的参数与预期结果,存储于本地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,我们一起学习吧!