一、流程和难点
流程:
1.用Excel存测试用例,从Excel取用例
2.在jmeter进行执行
3.执行完用例后把结果存进Excel
难点:
1.依赖字段:有的接口的入参是从别的接口返参获取的,所以执行接口前需要判断是否有依赖字段,并去获取
2.请求方式不同:一般会有get post put delete,这几种那你请求方式,要条件判断后用不同的取样器执行接口用例
3.断言:对接口返参进行校验,比如code值、数据的校验等,根据自己的项目来做判断
要突破以上难点就是要写Java代码啦,jmeter的beanshell派上用场。
PS:有一句话说得好:
学会beanshell才是会真正的使用jemter工具
二、Excel–用例模板
用例模板可以根据自己的需要进行添加,下面是我的模板,依次代表:
接口ID,依赖字段关联的接口ID,是否执行,接口名,请求方式,地址,请求头,入参,依赖字段,断言,角色
其中依赖字段关联的接口ID和依赖字段用逗号隔开,角色字段是为了获取每个角色的token。PS:根据自己的业务需求添加
三、Excel–写入执行结果数据的模板
把请求的参数写入,再加上返参和断言后的结果。也可以只写入执行失败的数据,在写入的时候做下判断为False的时候写入断言结果
四、jmeter操作
取用例 > 获取依赖参数 > 执行用例 > 响应断言并存数据
1.读取用例
一开始我是使用的CSV 获取参数,但是会碰到一个问题:
后面存数据的时候不能直接用这里parameter直接存。因为通过excel取数据,后面存数据需要引用比如引用参数 “${parameter}”,就会存在引号里面的数据parameter又有引号的问题,为了避免引号的问题,所以存数据的时候就用BeanShell代码单独获取有引号的数据,存入到变量里面,存数据的时候直接存变量就行了
我这里是直接用beanshell 通过Java代码去读取数据的:
import java.util.*;
import java.io.File;
import jxl.Workbook;
import jxl.Cell;
import jxl.Sheet;
File file = new File("${read_file}");
Workbook wb = Workbook.getWorkbook(file);
Sheet sheet = wb.getSheet("testCase");
//读取用例字段
String case_id="";
String pre_case_id="";
String priority="";
String api_name="";
String method="";
String url="";
String header="";
String parameter="";
String pre_parameter="";
String expect_assert="";
String role="";
int num_i=${num_i};
for (int j = 0; j < sheet.getColumns(); j++) {
Cell cell = sheet.getCell(j,num_i);
if(j == 0){
case_id=cell.getContents();
}else if(j == 1){
pre_case_id=cell.getContents();
}else if(j == 2){
priority=cell.getContents();
}else if(j == 3){
api_name=cell.getContents();
}else if(j == 4){
method=cell.getContents();
}else if(j == 5){
url=cell.getContents();
}else if(j == 6){
header=cell.getContents();
}else if(j == 7){
parameter=cell.getContents();
}else if(j == 8){
pre_parameter=cell.getContents();
}else if(j == 9){
expect_assert=cell.getContents();
}else if(j == 10){
role=cell.getContents();
}else{
break;
}
}
vars.put("case_id",case_id);
vars.put("pre_case_id",pre_case_id);
vars.put("priority",priority);
vars.put("api_name",api_name);
vars.put("method",method);
vars.put("url",url);
vars.put("header",header);
vars.put("parameter",parameter);
vars.put("pre_parameter",pre_parameter);
vars.put("expect_assert",expect_assert);
vars.put("role",role);
2.获取依赖参数
import java.util.*;
import jxl.Sheet;
import jxl.Cell;
import jxl.Workbook;
import org.json.JSONObject;
import org.json.JSONArray;
import com.opencsv.*;
//1.在读取文件,获取:依赖参数、依赖id、请求参数
String pre_case_id=vars.get("pre_case_id");
String[] preCaseIdArray = pre_case_id.split(",");
String pre_parameter=vars.get("pre_parameter");
String[] preParameterArray = pre_parameter.split(",");
String parameter=vars.get("parameter");
//2.在写入文件,获取依赖id和响应值
File file1 = new File("${write_file}");
RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReaderBuilder csvReaderBuilder = new CSVReaderBuilder(new InputStreamReader(new FileInputStream(file1), "GBK")).withCSVParser(rfc4180Parser);
CSVReader reader = csvReaderBuilder.build();
Iterator iterator = reader.iterator();
int j = 0;
ArrayList caseIdList= new ArrayList();
ArrayList responseDataList= new ArrayList();
while (iterator.hasNext()) {
//cvs行
String[] row = (String[])iterator.next();
caseIdList.add(row[0]);
responseDataList.add(row[12]);
j++;
}
//3.赋值参数值给依赖参数
String preParameter="";//依赖参数
String preCaseId="";//依赖id
String responseData="";//响应值
String preParameterRspon="";//响应值里依赖参数的值
try {
for (int n=0;n<preParameterArray.length;n++){
preParameter=preParameterArray[n];
preCaseId=preCaseIdArray[n];
int i;
for(i=0;i<caseIdList.size();i++){
String caseId=(String) caseIdList.get(i);
if (caseId.equals(preCaseId)){
responseData=(String) responseDataList.get(i);
JSONObject responseJson = new JSONObject(responseData);
if (preParameter.equals("carCode")){
JSONObject dataJson = responseJson.getJSONObject("data");
preParameterRspon = dataJson.getString("carCode").toString();
parameter=parameter.replace("${carCode}",preParameterRspon);
} else if (preParameter.equals("signId")){
JSONObject dataJson = responseJson.getJSONObject("data");
preParameterRspon = dataJson.getString("signId").toString();
parameter=parameter.replace("${signId}",preParameterRspon);
} else if (preParameter.equals("caseCode")){
JSONObject dataJson = responseJson.getJSONObject("data");
JSONObject pageListJson = dataJson.getJSONObject("pageList");
JSONArray jsonArray = pageListJson.getJSONArray("data");
for(int a = 0;a<jsonArray.length();a++) {
JSONObject key1 = (JSONObject)jsonArray.get(a);
preParameterRspon=(String)key1.get("caseCode");
}
parameter=parameter.replace("${caseCode}",preParameterRspon);
} else if(){
同理,往这里加你的项目需要判断的依赖字段
} else{
break;
}
}
}
}
}catch(Exception e){
log.info("------------------------------------------------------ 第${num_i}行接口的依赖接口错误,错误原因:"+e);
}
3.执行用例
因为请求方式的不同,用例执行的时候,需要判断请求方式。不同的请求方式可以放在不同的模块
4.响应断言并存数据
import java.util.*;
import org.json.JSONException;
import org.json.JSONObject;
import com.opencsv.*;
//二、响应断言并存数据
String assert_result = responseData.contains(expect_assert)?"TRUE":"FALSE";
CSVWriter writer= new CSVWriter(new FileWriter("${write_file}",true));
if(assert_result.equals("FALSE")){
String[] record = {case_id,pr_case_id,priority,api_name,method,url,header,parameter,pre_parameter,expect_assert,role,assert_result,responseData};
writer.writeNext(record);
}else{
String[] record = {case_id,pr_case_id,priority,api_name,method,url,header,parameter,pre_parameter,expect_assert,role,"",responseData};
writer.writeNext(record);
}
writer.close();
自动化执行jmeter脚本,框架的搭建可以看我的这个博客
链接
https://blog.csdn.net/qq_42873925/article/details/129334481?spm=1001.2014.3001.5501