jmeter+Java+Excel数据驱动接口自动化--提供免费beanshell代码和用例模板

一、流程和难点

流程:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值