JMeter使用BeanShell断言

news2024/11/26 0:59:22

BeanShell简介

BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如:

  • 定时器:BeanShell Timer

  • 前置处理器:BeanShell PreProcessor

  • 采样器:BeanShell Sampler

  • 后置处理器:BeanShell PostProcessor

  • 断言:BeanShell Assert

  • 监听器:BeanShell Listener

通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。

Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,比如:

  • prInt:非GUI模式下打印信息(输出信息到stdout)

  • log:输出信息到日志(文件)

  • log.debu("调试信息")

  • log.info("响应状态码" + ResponseCode)

  • log.warn("警告信息")

  • log.error("出错信息")

  • ResponseCode:响应状态码(String类型)

  • ResponseHeaders:响应头(String类型)

  • prev:获取当前请求结果

  • prew.getResponseDataAsString():获取响应体数据(String类型)

  • prew.getResponseCode():获取状态码(同ResponseCode,String类型)

  • vars: 操作jmeter变量

  • String var1 = vars.get("变量名"):获取变量的值(假设为String类型)

  • vars.put("变量名", 变量值):设置变量值

  • props: 操作JMeter属性

  • props.get(String,String) 可以获取Jmeter中已经生成的属性

  • props.put(String,String) 可以创建和更新Jmeter属性

  • ctx:获取当前线程上下文数据(可获取所有信息)

  • ctx.getVariables("变量名"):获取变量值(同vars.get())

  • ctx.setVariables("变量名", "变量值"):设置变量(同vars.put())

  • ctx.getProperties("属性名"):获取属性值(同props.get())

  • ctx.setProperties("属性名","属性值"):设置属性(同props.put())

  • ctx.getPreviousResult():获取当前请求结果同(prev)

  • ctx.getCurrentSampler():获取当前采样器

  • ctx.getPreviousSampler():获取前一采样器

  • ctx.getThreadNum():获取线程数

  • ctx.getThreadGroup():获取线程组

  • ctx. getThread():获取当前线程

  • ctx.getEngine():获取引擎

  • ctx.isSamplingStarted():判断采样器是否启动

  • ctx.isRecording():判断是否开启录制

  • ctx.getSamplerContext():获取采样器山下文数据

ctx详细API可参考: JMeter上下文

BeanShell断言

BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据,结合if判断通过变量Failure=false或Failure=true来设置断言是否通过,当设置Failure=true时,还可以设置FailureMessage来设置失败原因。

状态码断言

Copy//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){ 
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应状态码非200";  //指定失败原因
}
注:字符串只能使用双引号,字符串相等要使用"".equals("")

响应体包含特定字符

Copy//获取响应数据Stringresponse= prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含if(response.contains("登录成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应数据不包含登录成功";
}

JSON响应体字段提取及断言

将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,下载地址如下:

  • json.jar:下载地址 密码:8it7

  • gson.jar:下载地址 密码:6a7v

以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:

Copy//JSON响应断言import org.json.*;   //导入org.json包Stringresponse= prev.getResponseDataAsString();  //获取响应数据JSONObjectresponseJson=newJSONObject(response);  //转为JSON对象Stringmessage= responseJson.getString("message"); 
log.info("响应message字段:" + message);

if(message.equals("成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应message字段非成功";
}

JSONObject对象除了getString()方法外,还支持

  • getBoolean("字段名") :获取布尔类型字段值

  • getInt("字段名"):获取整型字段值

  • getLong("字段名"):获取长整型字段值

  • getDouble("字段名"):获取双精型字段值

  • getJSONObject("字段名"):获取嵌套Object类型字段值,JSONObject类型

  • getJSONArray("字段名"):获取嵌套Array类型,JSONArray类型

响应头解析

响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项

Copyimport java.util.HashMap;
import java.util.Map;

//将字符串用换行符 截取为adc数组
String [] headersList = ResponseHeaders.split("\n");

MapheadersMap=newHashMap();   //创建HashMap来从新组装headersfor(int i=1;i<headersList.length;i++){
	String [] itemList=headersList[i].split(": ");   // 将每一条Headerr项按冒号分割
	headersMap.put((itemList[0]), itemList[1]);   // 分键值放入HashMap
}

StringcontentType= headersMap.get("Content-Type");   // 提取相应项
log.info("响应Content-Type:" + contentType)

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件的生命周期(软件工程各阶段的工作)

其实软件工程是一个非常大的概念&#xff0c;我们的软件测试也好&#xff0c;软件开发也好&#xff0c;软件运维也好&#xff0c;其实都是属于软件工程的范畴。 今天就讲一讲软件工程和我们软件测试相关的一些内容。 我们今天三个主要的节点&#xff1a; 1.软件的生命周期 至…

QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托

1 写在前面的话 我们在之前写的《QT(7)-初识委托》文章末尾提到&#xff0c;“使用一个类继承QStyledItemDelegate实现常用的控件委托&#xff0c;在使用时可以直接调用接口&#xff0c;灵活实现各种委托”。我们接下来几篇文章将先详细讲解各个控件的委托&#xff0c;最后整理…

怎么理解输入输出流 - 输入输出流之我解

背景 昨天领导开会&#xff0c;讨论两个接口之间参数问题&#xff0c;这个参数涉及文件传递的需求&#xff1b;其中一句话引起了我的思考&#xff1a;“参数怎么定义&#xff1f;能不能定义成字符流&#xff1f;” 当时我沉思了一下&#xff0c;懵的 没明白她的意思 我理解的比…

swagger2接口文档

文章目录简介Open APISwagger简介Spring-fox入门案例第一步&#xff1a;导入依赖第二步&#xff1a;编写controller类第三步&#xff1a;编写启动类第四步&#xff1a;运行启动类并访问ui页面Swagger UI 介绍基础信息配置自定义注解&#xff08;防止有些类不生成接口文档&#…

数据结构:数组及特殊矩阵

数组及特殊矩阵一、认识数组1️⃣ 定义2️⃣ 存储结构1. 一维数组2. 二维数组二、特殊矩阵的压缩存储1️⃣ 对称矩阵&#x1f4a4;思考1&#xff1a;有多少个二维元素A[0...n-1][0...n-1]存于一维元素中❓&#x1f4a4;思考2&#xff1a;按行排列&#xff0c;二维数组A[0...n-1…

198分成功上岸浙江工业大学MBA的备考经验分享

我是2022年刚被浙江工业大学MBA项目录取的一名新生&#xff0c;新的一年管理类联考备考已经开始&#xff0c;最近身边有很多小伙伴也都在咨询这方面的信息&#xff0c;趁着今天有空给大家分享下我的经验。 在备考开始之前首先要确定目标&#xff0c;因为工作在杭州&#…

【正点原子Linux连载】第四章 SDK包的使用 摘自【正点原子】ATK-DLRV1126系统开发手册

1&#xff09;实验平台&#xff1a;正点原子RV1126 Linux开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692176265749 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第四章 S…

学习周报-20230203

文章目录一 在rhel7系统使用Mariadb一 联系和区别二 需求三 部署安装3.1 环境准备3.2 安装软件包3.3 启动服务3.4 设置防火墙策略四 创建用户和库表4.1 登录数据库4.2 创建用户4.3 创建数据库和表五 备份和恢复5.1 备份 com 数据库5.2 模拟误删除操作5.3 恢复表二 使用grep忽略…

如何建立异形板框的内缩和外扩

如何建立异形板框的内缩和外扩 首先把需要内缩和外扩的外形图设置在信号层&#xff08;比如TOP&#xff09;&#xff0c;把线宽改为0mil&#xff08;方便计算&#xff09;。然后选择外形图&#xff0c;执行命令TJ&#xff0c;就可以得到内缩和外扩图形。然后把生成的图形修改到…

Linux-查找文件、软链接、打包压缩和软件安装

查找文件find软链接ln打包和压缩tar软件安装apt-get1.查找文件find命令功能强大&#xff0c;通常用来在特定的目录下搜索符合条件的文件序号命令作用01find[路径] -name"*.py"查找指定路径下扩展名是.py的文件&#xff0c;包括子目录如果省略路径&#xff0c;表示在当…

最新整理Spring面试题2023

Spring面试专题 1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 有些同学可能会抢答&#xff0c;不熟悉!!! 好了&#xff0c;不开玩笑&#xff0c;面对这个问题我们应该怎么来回答呢&#xff1f;我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍…

【C++入门】引用详解(引用的特性、引用的使用、引用与指针的区别)

文章目录1 引用概念2 引用特性3 使用场景4 常引用5 传值与传引用的效率比较5.1 值和引用作为函数参数的性能比较5.2 值和引用作为返回值类型的性能比较6 引用和指针的区别1 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在的变量取了一个别名&#xff0c;编译器不会为…

浅谈网络流

网络 网络是一张单向图 , 每条边都有一个权值 c(u,v)c(u,v)c(u,v) 表示边 (u,v)(u,v)(u,v) 的容量. 特别的 , 图上有源点 (s)(s)(s) 和汇点 (t)(t)(t). 网络流 在一张网络上 , 从源点流出 , 最终流入汇点的流. f(u,v)f(u,v)f(u,v) 表示 (u,v)(u,v)(u,v) 的流量. 满足 : 容…

【测试总结系列-1】质量保障之测试左移和右移

在开发一个系统或者说软件&#xff0c;需求分析、软件设计、程序编码、软件测试、运行维护&#xff0c;这些阶段必不可少。整个周期中&#xff0c;作为测试人员&#xff0c;不是只在测试阶段才能发挥作用&#xff0c;也不是仅有测试对软件质量负责&#xff0c;一个项目团队&…

关于图片上传和在页面显示问题

最近在工作中遇到一个关于图片上传的问题。根据之前项目的经验&#xff0c;我知道目前这个公司上传图片有两种方式&#xff0c; 一种是把图片上传到公司服务器上&#xff0c;然后把图片放在服务器上的地址存在数据库中&#xff0c;要获得图片的时候直接从库中拿地址就行了另一…

分析网络抓包用 python 更高效

Abstract分析网络抓包用 python 更高效AuthorsWalter FanCategorylearning noteStatusv1.0Updated2023-01-10LicenseCC-BY-NC-ND 4.0 网络抓包分析用的最多的两大工具是 tcpdump 和 wireshark. 一般我们通过 tcpdump 或者 wireshark 来捕获网络包为 *.pcap 或者 *.pcapng 文件 …

Elasticsearch:在 Elasticsearch 中按距离有效地对地理点进行排序

计算搜索中两点之间的距离有很多用例。 如果你正在处理地理数据&#xff0c;那么无论你从事何种业务&#xff0c;这都必然会出现。 然后&#xff0c;在对这些点进行排序时&#xff0c;你可能需要考虑距离&#xff0c;因为……好吧&#xff0c;为什么不呢&#xff1f; 所以这里…

算法训练营DAY48|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

这一期到了买卖股票专题&#xff0c;买卖股票的有一些题型&#xff0c;可以使用贪心算法来求解&#xff0c;甚至有时候比动态规划更简单一些&#xff0c;但是本期是讲动态规划的运用&#xff0c;所以不做对于贪心的分析。今天只讲两道例题&#xff0c;其中第二题是第一题的变种…

[NeurIPS 2017] Poincaré Embeddings for Learning Hierarchical Representations

ContentsIntroductionPoincar EmbeddingsThe Limitations of Euclidean Space for Hierarchical DataEmbedding Hierarchies in Hyperbolic SpaceEvaluationReferencesIntroduction 如今&#xff0c;表征学习变得越来越重要 (e.g. word embedding, embeddings of graphs, embe…

如何在电脑上安装 Windows 版桌面编辑器 v7.3

线上编辑器的桌面端版本不需要持续的互联网连接&#xff0c;还可在计算机上处理脱机文件。因此&#xff0c;如果您需要此类功能&#xff0c;可从我们的网站中下载并安装桌面编辑器。 ONLYOFFICE桌面编辑器最新版 最近 ONLYOFFICE 发布了 v7.3&#xff0c;最新版本的桌面编辑器…