当前位置: 首页 > news >正文

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”。
    • 比较方式:选择“相等”。
  • 实际例子:假设一个用户信息查询接口 /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 进行性能测试或功能测试时&#xff0c;断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期&#xff0c;确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践&#xff…...

【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 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…...

水滴tabbar canvas实现思路

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

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中&#xff0c;某个文件的右下角有一把锁的标志是什么意思&#xff1f; 在 Ubuntu&#xff08;或其他基于 GNOME 文件管理器的 Linux 发行版&#xff09;中&#xff0c;文件或文件夹的右下角出现一把“锁”标志&#xff0c;通常表示 你当前的用户没有该文件/文件夹的写…...

7.1.1 计算机网络的组成

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

使用 Docker 部署 RabbitMQ 的详细指南

使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中&#xff0c;消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。本文将详细介绍如何使用 Docker 部署 RabbitMQ&#xf…...

岛屿的数量(BFS)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中)。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均被水包…...

线上JVM OOM问题,如何排查和解决?

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

Linux的缓存I/O和无缓存IO

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

【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术

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

【MySQL】(2) 库的操作

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

Hyper-V -docker-vmware 三者的关系

1. Docker 正常运行&#xff0c;需要启动Hyper-V &#xff0c;打开 hypervisorlaunchtype 2.VMware 正常时&#xff0c;需要关闭Hyper-V &#xff0c;关闭 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如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!

在全球化的今天&#xff0c;语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备&#xff0c;正在通过实时翻译与语音识别功能&#xff0c;打破语言壁垒&#xff0c;为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用&#xff0c;为实时翻译与语音识别功能的…...

LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))

LeetCode 热题 100_寻找两个正序数组的中位数&#xff08;68_4&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;先合并再挑选中位数&#xff09;&#xff1a;思路二&#xff08;划分数组&#xff08;二分查找…...

Java多线程与高并发专题——深入ReentrantReadWriteLock

深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的&#xff0c;还要保证线程安全的话。如果采用上述的两种互斥锁&#xff0c;效率方面很定是很低的。在这种情况下&#xff0c;咱们就可以使用ReentrantReadWr…...

【Python 语法】算法合集

查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之&#xff08;divide and conquer&#xff0c;D&C&#xff09;贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时&#xff0c; 如果不确定该如何 高效…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...