三、使用Jmeter 完成数据驱动的接口测试

一、前期准备

1、需要的jar包

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 

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

添加jar包后,在本地jmeter目录下创建用例文件,如下所示

 

 

各字段说明:

  • Case - 用例名称
  • parameter- 参数值,用于生成对API的请求
  • request - 在此列中,JMeter将向API写入接口路径
  • Method - 在此列中,JMeter将写入请求方法
  • ActualResult - 实际结果是我们接口实际返回的结果。将与预期值进行比较
  • ExpectedResult-预期结果是期望从API获得的结果,手动写入
  • ResponseCode 响应码是我们接口返回的响应状态
  • Status Jmeter将实际值与预期值进行比较,得出断言结论

二、 执行过程

1、添加一个线程组

2、添加一个用户变量,存放用例文件路径

 

 

3、添加一个JSR223采样器,目的是根据excel文件创建一个Workbook对象 

 

代码如下:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.*; 


    
    InputStream inputStream = new FileInputStream(new File("${pathToFile}"));
    //book = new XSSFWorkbook(inputStream);                                         //XSSF读取Excel2007;HSSF读取2003
    HSSFWorkbook book = new HSSFWorkbook(inputStream);
    //log.info("book:"+book);

try{    
    if(!book.equals("")){
        vars.putObject("book",book); 
    } else {    
        SampleResult.setStopTestNow(true); 
    }
    
    inputStream.close(); 

} catch(Exception e){
    log.info("!!!!!!!!"+ e.getMessage()+"!!!!!!!!!!!!!!!");

}

 

4、添加一个while控制器,用于Excel文件包含输入数据的行数,作为发送请求的次数。在while中添加如下代码控制while控制器停止

 

 5、While控制器下添加一个计数器,用于循环计数 

 

6、在While控制器下添加一个JSR223采样器 用于从excel中获取字符串,并将这些值存储在变量中

 

 代码如下:

 

import org.apache.poi.hssf.usermodel.*;
import java.io.*;

int i = Integer.parseInt(vars.get("counter"));

HSSFRow row = vars.getObject("book").getSheetAt(1).getRow(i);

String orderid = vars.get("orderid");

//零件ID
String partid1 = vars.get("partid1");
String partid2 = vars.get("partid2");

//零件数量
String quantity1 = vars.get("quantity1");
String quantity2 = vars.get("quantity2");


vars.putObject("row",row);    
    
    for (int j = 1; j <= vars.getObject("book").getSheetAt(3).getRow(0).getLastCellNum(); j++) {
        if (row.getCell(j) == null) {
            row.createCell(j).setCellValue("");
        }
    }    

    String parameter = row.getCell(6).toString();
    
    parameter = parameter.replace("orderid",orderid);
    parameter = parameter.replace("partid1",partid1);
    parameter = parameter.replace("partid2",partid2);
    parameter = parameter.replace("quantity1",quantity1);
    parameter = parameter.replace("quantity2",quantity2);
    //print("parameter:"+parameter);
    vars.put("parameter",parameter);

    String request = row.getCell(3).toString();
    //print("request:"+request);
    vars.put("request",request);

    String Method = row.getCell(5).toString();
    //print("Method:"+Method);
    vars.put("Method",Method);

    String expectedResult = row.getCell(9).toString();
    //print("expectedResult:"+expectedResult);
    vars.put("expectedResult",expectedResult);

    String Case = row.getCell(0).toString();
    //print("Case:"+Case);
    vars.put("Case",Case);

//    String comment = row.getCell(2).toString();
//    vars.put("Comment",comment);

 

7、在While控制器添加一个if控制器 ,用于判断excel中的方法,决定接口分支

 

8、在IF控制器下添加http请求 ,该请求在控制器下循环读取用例(接口路径和参数)

 

9、在http请求下循环提取响应信息 ,添加一个BeanShell断言 ,用于比较实际结果和预期结果,并在Excel中记录响应实际值,响应状态和用例通过状态

 代码如下:

import org.apache.poi.hssf.usermodel.*;
import java.io.*;

String requestCode = SampleResult.getUrlAsString();
String codeFromApi = ("${code}");
String status = null;

if (vars.get("expectedResult").equals(codeFromApi)) {
    status = "Passed";
} else {
    status = "Failed";
}

vars.getObject("row").createCell(10).setCellValue(codeFromApi);
vars.getObject("row").createCell(11).setCellValue(status);

String stopWhile = null;
int i = Integer.parseInt(vars.get("counter"));
//int j = vars.getObject("book").getSheetAt(1).getLastRowNum();
//print("---------------------------------");
//print("i:"+i);
//print("j:"+j);
if (i >= vars.getObject("book").getSheetAt(3).getLastRowNum()) {
    stopWhile = "OK";
    vars.put("stopWhile",stopWhile);
}

 

10、添加JSR223采样器 ,用于回写运行结果到excel中

代码如下:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.*; 

try {
    
    FileOutputStream out = new FileOutputStream(new File("${pathToFile}"));
    vars.getObject("book").write(out);
    vars.getObject("book").close();

} catch (Exception e) {

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

 

脚本结构

 

posted @ 2021-01-18 15:26  晨尛  阅读(304)  评论(0编辑  收藏  举报