Jmeter进阶使用:BeanShell实现接口前置和后置操作

news/2024/11/16 19:37:17/

一、背景

我们使用Jmeter做压力测试或者接口测试时,除了最简单的直接对接口发起请求,很多时候需要对接口进行一些前置操作:比如提前生成测试数据,以及一些后置操作:比如提取接口响应内容中的某个字段的值。举个最常用的例子:

会员注册接口:需要使用电话号码作为入参,电话号码不能重复,注册接口需要添加前置操作生成不重复的电话号码。

注册成功后:需要从接口返回的内容中,提取注册生成的用户ID的值,作为后续其他接口操作的入参。

要实现以上的需求,有多种方式,比如:

函数助手生成随机数;

手动在excel表中准备好足够多的号码,通过添加配置元件CSV data set config来获取(不推荐);

正则表达式提取值;

通过BeanShell编码实现;

本文主要给大家讲解如何通过BeanShell编码实现,该方法可扩展性强。掌握之后,你会发现很多场景都可以通过编写相应的编码来实现,一通百通。

二、BeanShell生成不重复的电话号码

Sampler前面加一个前置处理器BeanShellPreProcessor:

BeanShell PreProcessor的内容为:

代码内容:

//获取指定范围111-199间的随机数作为电话号码的前缀
long phoneTitle=${__Random(111,199,)};
String phoneTitleValue=phoneTitle.toString();
log.info(phoneTitleValue.toString());//当前时间戳,比如:1649038001761,除100000,得到一个8位的时间戳数字。
long num1 = ${__time(/100000,)};
log.info(num1.toString());
//取1个[1,100000]的随机数字,有极低的概率重复
long num2 = ${__Random(1,100000,)};
log.info(num2.toString());
//num1+num2生成1个新的8位的数值
long num = num1+num2;//通过时间戳值的变化+随机数字生成新的随机值、前面再拼接随机的电话号码前缀
//生成一个不会重复的电话号码
String phoneValue=phoneTitleValue+num.toString();
//存为变量phone,供后面的接口使用
vars.put("phone",phoneValue);

每一行我都加了相应的注释,方便理解该行代码的作用,应该已经非常好理解了。

接口请求中使用定义好的变量phone:

查看接口效果:

三、BeanShell 从响应结果中提取内容

先在接口Sampler上右键,添加后置处理器BeanShell Post Processor:

假设接口返回内容为:
{“code”:“0000”,“msg”:“”,“data”:{“userId”:111111,“phone”:“12011111111”,“cardNo”:“8000000000”}} 

{"code":"0000","msg":"","data":{"userId":111111,"phone":"12011111111","cardNo":"8000000000"}
}

BeanShell Post Processor脚本代码内容:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;//获取响应内容
vars.put("reponseContent",prev.getResponseDataAsString());
//获取响应code
vars.put("reponseCode",prev.getResponseCode());//获取响应内容,String类型存储
String resjson=prev.getResponseDataAsString();
log.info(resjson);
//转为Json对象
JSONObject jso=JSONObject.parseObject(resjson);
//从对象中获取code的值
String codeValue=jso.getString("code");
log.info(codeValue);
//从对象中获取子的Json对象data
JSONObject data=jso.getJSONObject("data");
log.info(data.toString());
//获取子的Json对象data中的userId的值
String useridValue=data.getString("userId");
log.info(useridValue);
//将获取到的userId的值存为变量userid,供后面的接口使用
vars.put("userid",useridValue);

每一行我都加了相应的注释,方便理解该行代码的作用,应该已经非常好理解了。

运行请求,Jmeter运行日志中可以看到各个值都成功获取到了:

后面的接口使用BeanShell Post Processor脚本中定义好的变量userid:

总结:BeanShell代码和Java代码非常相似,有Java编程基础的同学可以快速的上手,通过编码的方式可以很好的扩展我们需要的功能,也是Jmeter进阶使用的必学必会知识之一 ~

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末领取】


     【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图+全套资料】


一、Python编程入门到精通

二、接口自动化项目实战  

三、Web自动化项目实战


四、App自动化项目实战  

五、一线大厂简历


六、测试开发DevOps体系  

七、常用自动化测试工具

八、JMeter性能测试  

九、软件测试全套资料

十、总结(文末尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!   


http://www.ppmy.cn/news/1038397.html

相关文章

网络连接(3次握手和4次挥手)

在进行3次握手和4次挥手传输数据时,都可能会出现丢包的情况,推荐看出现丢包问题的情况以及解决方法 一.为什么要进行3次握手? 在进行网络连接时,需要3次握手 3次握手的初心就是两方面: 1.投石问路,验证通…

《论文阅读14》FAST-LIO

一、论文 研究领域:激光雷达惯性测距框架论文:FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter IEEE Robotics and Automation Letters, 2021 香港大学火星实验室 论文链接论文github 二、论文概…

Python Web开发 Django 简介

今天来为大家介绍 Python 另一个 Web 开发框架 Django,它是一个基于 Python 定制的开源 Web 应用框架,最早源于一个在线新闻 Web 网站,后于2005年开源。Django 的功能大而全,它提供的一站式解决的思路,能让开发者不用在…

《零基础实践深度学习》(第2版)学习笔记,(五)深度学习与计算机视觉

文章目录 1. 计算机视觉概述2. 图像分类3. 目标检测 1. 计算机视觉概述 图像分类 目标检测 2. 图像分类 3. 目标检测

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了,感觉并不是想象中的好用,特别是出现些稀奇古怪的问题不好解决,比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

python 开启5个进程处理list数据

要在 Python 中开启多个进程来处理列表数据,你可以使用 multiprocessing 模块。下面是一个开启5个进程处理列表数据的示例代码: python import multiprocessingdef process_item(item):# 在这里处理每个列表项的逻辑print(f"Processing item: {ite…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计(Latin square design):实验研究中涉及一个处理因素和两个控制因素,每个因素的类别数或水平数相等,此时可采用拉丁方设计,将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

用于量子通信和互联网的光量子芯片

近年来,新兴的光量子芯片在量子通信和量子互联网领域取得了重大进展。光量子芯片芯片具有可扩展、稳定和低成本等特点,为微型化应用开辟了新的可能性。 7月14日,一篇发表在《light: science & applications》的文章概述了用于量子通信的光…