JMeter 断言最佳实践
JMeter 断言最佳实践
一、引言
在使用 JMeter 进行性能测试或功能测试时,断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期,确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践,并给出实际例子。
二、JMeter 常见断言类型及实际例子
2.1 响应断言(Response Assertion)
- 功能:用于验证响应内容是否包含、不包含特定的文本,或者是否与特定的模式匹配。
- 适用场景:适用于验证接口返回的文本信息,如登录成功提示、错误信息等。
- 示例配置
- 要测试的响应字段:选择“响应文本”。
- 模式匹配规则:选择“包含”。
- 测试模式:填写“登录成功”。
- 实际例子:假设我们有一个登录接口
/login
,发送用户名和密码后,若登录成功,响应文本会包含“登录成功”字样。在 JMeter 中添加一个 HTTP 请求采样器用于模拟登录请求,然后在该采样器下添加响应断言,按上述配置进行设置。当运行测试时,如果响应文本包含“登录成功”,则断言通过;否则,断言失败。
2.2 持续时间断言(Duration Assertion)
- 功能:用于验证请求的响应时间是否在指定的范围内。
- 适用场景:性能测试中,验证接口的响应时间是否满足性能指标要求。
- 示例配置
- 最大响应时间:设置为 500(毫秒)。
- 实际例子:对于一个商品查询接口
/products
,业务要求该接口的响应时间不能超过 500 毫秒。在 JMeter 中添加该接口的 HTTP 请求采样器,然后添加持续时间断言,将最大响应时间设置为 500 毫秒。运行测试时,如果该接口的响应时间超过 500 毫秒,断言失败,表明该接口的性能不满足要求。
2.3 大小断言(Size Assertion)
- 功能:用于验证响应数据的大小是否在指定的范围内。
- 适用场景:验证接口返回的数据量是否符合预期,避免返回过大或过小的数据。
- 示例配置
- 响应数据的大小:选择“小于”,并设置具体的大小值为 1024(字节)。
- 实际例子:有一个图片缩略图获取接口
/thumbnails
,预期返回的缩略图数据大小不超过 1024 字节。在 JMeter 中添加该接口的 HTTP 请求采样器,接着添加大小断言,设置响应数据大小小于 1024 字节。运行测试时,若返回的缩略图数据大小超过 1024 字节,断言失败,说明返回的数据量不符合预期。
2.4 JSON 断言(JSON Assertion)
- 功能:用于验证 JSON 格式的响应数据是否符合预期。可以验证 JSON 节点的值、节点是否存在等。
- 适用场景:当接口返回 JSON 数据时,使用 JSON 断言可以方便地验证数据的准确性。
- 示例配置
- JSON 路径表达式:填写
$.user.name
。 - 预期值:填写“John Doe”。
- 比较方式:选择“相等”。
- JSON 路径表达式:填写
- 实际例子:假设一个用户信息查询接口
/users/1
返回的 JSON 数据如下:
{"user": {"name": "John Doe","age": 30}
}
在 JMeter 中添加该接口的 HTTP 请求采样器,然后添加 JSON 断言,按上述配置进行设置。运行测试时,若返回的 JSON 数据中 $.user.name
的值为“John Doe”,则断言通过;否则,断言失败。
2.5 XML 断言(XML Assertion)
- 功能:用于验证 XML 格式的响应数据是否符合预期。可以验证 XML 节点的值、节点是否存在、XML 结构是否正确等。
- 适用场景:当接口返回 XML 数据时,使用 XML 断言可以确保数据的正确性。
- 示例配置
- 验证 XML 结构:勾选该选项。
- XPath 查询:填写
//product/name
。 - 预期值:填写“Smartphone”。
- 实际例子:一个商品信息接口
/products/1
返回的 XML 数据如下:
<products><product><name>Smartphone</name><price>999</price></product>
</products>
在 JMeter 中添加该接口的 HTTP 请求采样器,然后添加 XML 断言,按上述配置进行设置。运行测试时,若 XML 结构正确且 //product/name
节点的值为“Smartphone”,则断言通过;否则,断言失败。
三、断言的最佳实践
3.1 合理选择断言类型
根据接口返回的数据类型和验证需求,选择合适的断言类型。例如:
- 如果接口返回文本信息,优先使用响应断言。
- 对于 JSON 数据,使用 JSON 断言可以更精准地验证数据。
- 在性能测试中,使用持续时间断言和大小断言来验证性能指标。
3.2 明确断言的预期值
在配置断言时,要明确预期值。预期值应该基于接口文档或业务需求,避免使用模糊或不确定的值。例如,在验证登录接口时,明确登录成功的提示信息,而不是使用一个宽泛的“成功”字样。
3.3 避免过度断言
虽然断言可以提高测试的准确性,但过度使用断言可能会导致测试用例过于脆弱。只对关键的、影响业务逻辑的部分进行断言,避免对一些无关紧要的细节进行断言。例如,对于接口返回的时间戳,只需要验证其格式是否正确,而不需要验证具体的值。
3.4 结合多个断言
在某些情况下,单一的断言可能无法满足验证需求。可以结合多个断言来进行更全面的验证。例如,在验证一个订单接口时,可以同时使用响应断言验证订单状态信息,使用 JSON 断言验证订单金额是否正确。
3.5 断言的位置和作用域
- 位置:断言应该添加在需要验证的采样器之后,确保对该采样器的响应进行验证。
- 作用域:可以设置断言的作用域,包括当前采样器、当前线程组、所有采样器等。根据实际需求选择合适的作用域。
3.6 断言的错误处理
在断言失败时,JMeter 会将该请求标记为失败。可以通过添加监听器(如“聚合报告”)来查看断言失败的情况。同时,在测试报告中明确记录断言失败的原因,方便后续的问题排查。
四、示例代码(使用 BeanShell 断言进行复杂验证)
有时候,现有的断言类型无法满足复杂的验证需求,这时可以使用 BeanShell 断言。以下是一个使用 BeanShell 断言验证 JSON 响应中某个字段值范围的示例:
import org.json.JSONObject;// 获取响应数据
String response = prev.getResponseDataAsString();try {// 解析 JSON 数据JSONObject json = new JSONObject(response);// 获取要验证的字段值int fieldValue = json.getInt("fieldName");// 验证字段值的范围if (fieldValue >= 10 && fieldValue <= 100) {Failure = false;FailureMessage = "";} else {Failure = true;FailureMessage = "字段值不在 10 到 100 的范围内";}
} catch (Exception e) {Failure = true;FailureMessage = "解析 JSON 数据时出错:" + e.getMessage();
}
在这个示例中,我们使用 BeanShell 断言验证 JSON 响应中名为 fieldName
的字段值是否在 10 到 100 的范围内。如果不在该范围内,断言失败并记录错误信息。
五、总结
JMeter 断言是保证测试准确性和可靠性的重要工具。通过合理选择断言类型、明确预期值、避免过度断言、结合多个断言等最佳实践,可以提高测试的效率和质量。同时,对于复杂的验证需求,可以使用 BeanShell 断言进行灵活处理。
相关文章:
JMeter 断言最佳实践
JMeter 断言最佳实践 一、引言 在使用 JMeter 进行性能测试或功能测试时,断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期,确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践ÿ…...

【Android】类加载器热修复-随记(二)
1. 背景 在【Android】类加载器&热修复-随记一文中了解了类加载,要完成完整的热修复过程,我们需要构建出差量jar包。而这构建差量包分为两个步骤: 原包,注解解析和插桩;变更后,差量包构建;在这两步过程中会涉及到较多的字节码操作,这里我们需要了解下。我们都听过…...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表
简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…...

Linux网络 TCP全连接队列与tcpdump抓包
TCP全连接队列 在 Linux 网络中,TCP 全连接队列(也称为 Accept 队列)是一个重要的概念,用于管理已经完成三次握手,即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接,避免因…...

水滴tabbar canvas实现思路
废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…...

鸿蒙通过用户首选项实现数据持久化
鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该…...
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思? 在 Ubuntu(或其他基于 GNOME 文件管理器的 Linux 发行版)中,文件或文件夹的右下角出现一把“锁”标志,通常表示 你当前的用户没有该文件/文件夹的写…...

7.1.1 计算机网络的组成
文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统,便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…...

使用 Docker 部署 RabbitMQ 的详细指南
使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中,消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。本文将详细介绍如何使用 Docker 部署 RabbitMQ…...
岛屿的数量(BFS)
给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中)。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包…...

线上JVM OOM问题,如何排查和解决?
今天咱们来聊聊让无数 Java 开发者头疼的 JVM OOM(Out Of Memory,内存溢出)问题。在面试中,OOM 问题也是面试官的“心头好”,因为它能直接考察你对 JVM 的理解,以及你在实际问题面前的排查和解决能力。 一…...

Linux的缓存I/O和无缓存IO
一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域,存放用来接收用户输入和用于计算机输出的数据,以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作(标准IO操作)。为什么存在C标准I/O库…...

【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...

【MySQL】(2) 库的操作
SQL 关键字,大小写不敏感。 一、查询数据库 show databases; 注意加分号,才算一句结束。 二、创建数据库 {} 表示必选项,[] 表示可选项,| 表示任选其一。 示例:建议加上 if not exists 选项。 三、字符集编码和排序…...

Hyper-V -docker-vmware 三者的关系
1. Docker 正常运行,需要启动Hyper-V ,打开 hypervisorlaunchtype 2.VMware 正常时,需要关闭Hyper-V ,关闭 hypervisorlaunchtype 2.1资源管理器->CPU 里要开启虚拟化 2.2 服务-停掉HV服务 2.3 控制面板 不勾选 2.4 …...

IP-----双重发布
目录 6.双重发布 1.重发布的作用 2.部署条件 1.必须存在ASBR 2.种子度量值 3.重发布的规则 4.重发布的数量 5.重发布的场景 1.场景和规则 2.直连和静态 3.动态RIP 4.动态OSPF 5.更改开销值 6.重发布的问题1 7.重发布的问题2 1.流量 2.前缀列表 3.偏移列表 4…...

【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!
在全球化的今天,语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备,正在通过实时翻译与语音识别功能,打破语言壁垒,为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用,为实时翻译与语音识别功能的…...
LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))
LeetCode 热题 100_寻找两个正序数组的中位数(68_4) 题目描述:输入输出样例:题解:解题思路:思路一(先合并再挑选中位数):思路二(划分数组(二分查找…...
Java多线程与高并发专题——深入ReentrantReadWriteLock
深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的,还要保证线程安全的话。如果采用上述的两种互斥锁,效率方面很定是很低的。在这种情况下,咱们就可以使用ReentrantReadWr…...

【Python 语法】算法合集
查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之(divide and conquer,D&C)贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时, 如果不确定该如何 高效…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...