浅谈断言之响应断言

news2024/9/22 15:41:35

浅谈断言之响应断言

在进行测试时,确保服务器响应的内容符合预期是至关重要的,这时就需要用到JMeter的断言功能。响应断言(Response Assertion)是JMeter中最常用的一种断言类型,它允许用户验证服务器响应数据是否包含(或不包含)特定的文本、模式或其他条件,以此来判断请求是否成功。

响应断言的基本概念

响应断言用于检查服务器响应的数据,根据设置的条件判断请求是否通过。它支持多种匹配模式,包括但不限于子字符串匹配、正则表达式匹配、响应代码匹配等。通过灵活配置响应断言,测试人员可以精确控制测试用例的成功标准。

响应断言的配置步骤

  1. 添加响应断言:
    ○ 在JMeter中打开你的测试计划,选择需要添加断言的取样器(例如HTTP请求)。
    ○ 右键点击该取样器,选择“添加” -> “断言” -> “响应断言”。
  2. 配置断言细节:
    ○ 名称: 给断言命名,便于识别。
    ○ Apply to: 选择断言应用的对象,如Main sample only(仅主样本)、Sub-samples(子样本)等,之前已经有专门的文章进行介绍。
    ○ 测试字段: 需要验证的响应部分,常见的选项有“Text Response”(响应文本)、“Document (text)”(文档文本,适用于HTML页面)、“Code”(响应代码)等。
    ○ 模式匹配规则: 匹配规则,如“Contains”(包含)、“Matches”(匹配)、“Equals”(等于)、“Not”(不包含/不匹配)等,具体响应断言的匹配模式及使用场景介绍如下
    ● 包含(Contains): 验证响应中是否包含指定的文本字符串。适用于检查响应中是否存在特定关键字或短语。
    ● 匹配(Matches): 使用正则表达式进行匹配,适合更复杂的文本模式验证。
    ● 相等(Equals): 验证响应内容是否与指定的字符串完全相同,常用于精确匹配测试。
    ● 字符串(Substring): 类似于Contains,但提供更灵活的子串匹配选项。
    ● 否(Not): 用于验证响应中不包含特定文本或不匹配特定模式。
    ● 或者(Or): 用于验证响应中包含A或者B这种特定模式。
    ○ 测试模式: 输入期望的文本或正则表达式。如果是多个模式,可以使用换行分隔。
    ○ 自定义失败消息: 自定义失败的内容。

应用实例

我们通过SpingBoot框架编写如下测试接口代码:

@PostMapping(value = "/login",produces = "application/json;charset=UTF-8")
    public String authenticate(@RequestBody JSONObject request) {

        String validUsername = "admin";
        String validPassword = "password";
        String response = "{\"total\":2,\"data\":[{\"id\":123,\"name\":\"John Doe\",\"email\":\"johndoe@example.com\",\"phone\":\"123-456-7890\",\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\"},\"interests\":[\"sports\",\"music\",\"travel\"]},{\"id\":456,\"name\":\"Jane Smith\",\"email\":\"janesmith@example.com\",\"phone\":\"987-654-3210\",\"address\":{\"street\":\"456 Elm St\",\"city\":\"Los Angeles\",\"state\":\"CA\",\"zip\":\"90001\"},\"interests\":[\"reading\",\"cooking\",\"hiking\"]}]}";


        if (request.getString("username").equals(validUsername) && request.getString("password").equals(validPassword)) {
            return response;
        } else {
            return response;
        }
    }

我们编写如下测试脚本
在这里插入图片描述
线程组:保持默认
HTTP信息头管理器:名称content-type,值为application/json;charset=UTF-8
HTTP请求:协议http,服务器名称或IP为127.0.0.1,端口设置为8091,方法为post,路径/login,内容编码为utf-8,消息体数据设置如下

{
	"username": "admin",
	"password": "password"
	}

运行脚本,查看结果树,在HTTP请求的响应数据中Response Body查看结果如下:

{"total":2,"data":[{"id":123,"name":"John Doe","email":"johndoe@example.com","phone":"123-456-7890","address":{"street":"123 Main St","city":"New York","state":"NY","zip":"10001"},"interests":["sports","music","travel"]},{"id":456,"name":"Jane Smith","email":"janesmith@example.com","phone":"987-654-3210","address":{"street":"456 Elm St","city":"Los Angeles","state":"CA","zip":"90001"},"interests":["reading","cooking","hiking"]}]}

HTTP请求的响应数据中Response Headers如下

HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Content-Length: 433
Date: Thu, 18 Jul 2024 09:05:59 GMT
Keep-Alive: timeout=60
Connection: keep-alive

取样器结果查看可以得知如下内容

Data type (“text”|“bin”|“”): text
Response code: 200
Response message:
HTTPSampleResult fields:
ContentType: application/json;charset=UTF-8
DataEncoding: UTF-8

情况1:测试字段
响应文本

响应断言:测试字段选择响应文本,模式匹配规则选择包含,如上述返回消息内容可知有total字段,所以测试模式中添加输入total字符
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

响应代码

响应断言:测试字段选择响应代码,模式匹配规则选择包含,如上述返回消息头可知响应代码为200,所以测试模式中添加输入200
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

响应信息

响应断言:测试字段选择响应信息,模式匹配规则选择包含,如上述取样器结果可知响应信息Response message为null,模式匹配规则勾选否
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

响应头

响应断言:测试字段选择响应信息,模式匹配规则选择包含,如上述返回消息可知响应头中包含application/json;charset=UTF-8,所以测试模式中添加输入application/json;charset=UTF-8
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

请求头

响应断言:测试字段选择响应信息,模式匹配规则选择包含,如上述请求内容中可知请求头中包含Apache-HttpClient/4.5.7,所以测试模式中添加输入Apache-HttpClient/4.5.7
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

URL样本

响应断言:测试字段选择响应信息,模式匹配规则选择包含,如上述请求内容中可知请求体中包含http://127.0.0.1:8091/login,所以测试模式中添加输入http://127.0.0.1:8091/login
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

请求数据

响应断言:测试字段选择请求数据,模式匹配规则选择包含,如上述请求内容中可知请求体数据中包含

{
    "username": "admin",
    "password": "password"
    }

所以测试模式中添加输入"username": “admin”
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

忽略状态

响应断言:勾选忽略状态
HTTP请求:编写一个不存在的接口,例如:/login1
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述
但是具体看里面内容可以得到如下信息,在响应数据的Response Body中可以看到如下服务器返回错误

{"timestamp":"2024-07-19T02:21:12.237+00:00","status":404,"error":"Not Found","message":"","path":"/login1"}

Response Headers中可以看如下信息

HTTP/1.1 404
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 19 Jul 2024 02:21:12 GMT
Keep-Alive: timeout=60
Connection: keep-alive

情况2:模糊匹配规则
包含

响应断言:测试字段选择响应文本,模式匹配规则选择包含,如上述返回消息内容可知有total字段,所以测试模式中添加输入total字符
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

匹配

响应断言:测试字段选择响应文本,模式匹配规则选择匹配,如上述返回消息内容可知有total字段,所以测试模式中使用正则表达式.*total.*进行匹配,使用了.*来表示零个或多个任意字符,这样在匹配整个响应内容时会更灵活。
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

相等

响应断言:测试字段选择响应文本,模式匹配规则选择相等,如上述返回消息内容,所以测试模式中使用返回消息的所有内容进行断言。
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
字符串
响应断言:测试字段选择响应文本,模式匹配规则选择字符串,如上述返回消息内容可知有total字符串,所以测试模式中添加输入total字符串
运行结果,查看结果树中是否成功,http请求断言成功,不显示断言的结果
在这里插入图片描述

响应断言:测试字段选择响应文本,模式匹配规则选择字符串,如上述返回消息内容可知有total字符串,所以测试模式中添加输入total字符串,然后选择再勾选否
运行结果,查看结果树中是否成功,http请求断言失败,显示断言的结果
在这里插入图片描述
查看断言信息

Assertion error: false
Assertion failure: true
Assertion failure message: Test failed: text expected not to contain /total/

或者

响应断言:测试字段选择响应文本,模式匹配规则选择字符串,如上述返回消息内容可知有total,但是没有data1字符串,只有data,所以测试模式中添加第一个字符为total,,第二个字符为data1
运行结果,查看结果树中是否成功,http请求断言失败,显示断言的结果
在这里插入图片描述
查看断言信息

Assertion error: false
Assertion failure: true
Assertion failure message: Test failed: text expected to contain /data1/

然后我们再勾选模式匹配规则中的或者,再次运行脚本,http请求断言成功,不显示断言的结果
在这里插入图片描述

情况3:自定义失败的消息

响应断言:测试字段选择响应文本,模式匹配规则选择字符串,如上述返回消息内容可知有total字符串,所以测试模式中添加输入total字符串,然后选择再勾选否,自定义失败消息中添加内容“断言失败了”
运行结果,查看结果树中是否成功,http请求断言失败,显示断言的结果
在这里插入图片描述
查看断言信息

Assertion error: false
Assertion failure: true
Assertion failure message: 断言失败了

总结

响应断言是JMeter中进行结果验证的关键组件,通过精确控制验证条件,可以有效地评估系统行为是否符合预期。熟练掌握其配置与应用,对于提高测试效率和准确性至关重要。随着实践的深入,你将能更加灵活地运用各种匹配规则,以满足不同测试场景的需求。

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

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

相关文章

Vue3新增时自动获取当前时间

如图&#xff0c;点击新增的时候自动获取当前的时间来作为创建时间 时间组件&#xff1a; <el-form-item label"创建时间" prop"createTime"><el-date-pickerv-model"createTime"type"datetime"value-format"x"pla…

AI算不出9.11和9.9哪个大?六家大模型厂商总结了这些原因

大模型“答对”或“答错”其实是个概率问题。关于“9.11和9.9哪个大”&#xff0c;这样一道小学生难度的数学题难倒了一众海内外AI大模型。7月17日&#xff0c;第一财经报道了国内外“12个大模型8个都会答错”这道题的现象&#xff0c;大模型的数学能力引发讨论。 “从技术人员…

《基于 CDC、Spark Streaming、Kafka 实现患者指标采集》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…

RV1103使用rtsp和opencv推流视频到网页端

参考&#xff1a; Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-pinout/CSI-Camera Luckfox-Pico/RKMPI-example Luckfox-Pico/RKMPI-example 下载源码 其中源码位置&#xff1a;https://github.com/luckfox-eng29/luckfox_pico_rtsp_opencv 使用git clone由于项目比较大&am…

vi 编辑器快捷生成 main 函数和基本框架

step1: 执行 sudo vi /etc/vim/vimrc &#xff08;修改vimrc需要管理员权限&#xff1a;sudo&#xff09; step2:输入用户密码&#xff0c;回车, 编辑vimrc文件 step3:在尾行输入以下代码&#xff08;可复制&#xff09; map mf i#include<stdio.h><ESC>o#includ…

一篇论文分享,以多模态的形式来做RAG的研究

这篇论文&#xff0c;给我很强的割裂感和冲击感。非常值得阅读。我是做RAG相关研究工作的 &#xff0c;过去一年在做传统的RAG&#xff0c;就是标准的文档解析&#xff0c;chunk&#xff0c;召回&#xff0c;排序&#xff0c;模型生成答案这条路。深谙RAG的复杂&#xff0c;中间…

PostgreSQL创建表和自增序列

一、创建表&#xff1a; 注意&#xff1a; 1、在mysql没有序列的概念&#xff0c;id自增通过auto_increment实现&#xff1b; 2、pgsql没有auto_increment的概念&#xff0c;如何实现id自增&#xff1f;有两种方式&#xff1a; 方式一&#xff1a;创建序列&#xff0c;绑定…

Dify是什么?能用来做什么?

吾名爱妃&#xff0c;性好静亦好动。好编程&#xff0c;常沉浸于代码之世界&#xff0c;思维纵横&#xff0c;力求逻辑之严密&#xff0c;算法之精妙。亦爱篮球&#xff0c;驰骋球场&#xff0c;尽享挥洒汗水之乐。且喜跑步&#xff0c;尤钟马拉松&#xff0c;长途奔袭&#xf…

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…

Axios使用方法详解,从入门到进阶

目录 &#x1f333; Axios的诞生 &#x1f333; Axios的介绍 定义 原理 特性 浏览器支持情况 如何安装 &#x1f333; Axios的使用 ◼️ 创建vue项目 ◼️ Axios的基础用法&#xff08;get、post、put 等请求方法&#xff09; get方法 post方法 put和patch方法 …

ts踩坑!vue3中ts文件用export导出公共方法的ts类型定义

当我们有一个ts文件&#xff0c;定义并export出该function&#xff0c;其中方法里边有定义的变量&#xff0c;方法、钩子函数等多种&#xff0c;并最终return出该变量、方法。 此时 ts规则校验会让我们返回该函数类型。如下 export default function () {const chart ref();c…

vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转

一 myChart.on(click, (params) > {if (params.componentType series && params.dataIndex ! undefined) {const months this.month_htqd[params.dataIndex]; // 获取点击柱状图的 X 轴坐标值alert(点击了柱状图&#xff0c;值为: ${months});// 根据点击的柱状图…

PHP房产中介租房卖房平台微信小程序系统源码

​&#x1f3e0;【租房卖房新选择】揭秘房产中介小程序&#xff0c;一键搞定置业大事&#xff01;&#x1f3e1; &#x1f50d;【开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷】&#x1f50d; 还在为找房子跑断腿&#xff1f;为卖房发愁吗&#xff1f;今天给大家安利一个超…

前端开发_注意事项

无论使用哪种框架开发&#xff08;vue、react、...&#xff09;&#xff0c;前端开发终究是结构&#xff08;HTML&#xff09;、样式&#xff08;CSS&#xff09;、逻辑&#xff08;用户操作数据处理对接后端API&#xff09;。那么开发过程中都需要注意哪些事项&#xff0c;本文…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户&#xff0c;老用户不计费直接放行&#xff0c;新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯&#xff0c;无车亮绿灯&#xff0c;能够实现车位诱导 5.车辆出停车场时&#xff0c;能根据停车时间计算停车…

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一&#xff1a;概要 Flume 是一个可配置、可靠、高可用的大数据采集工具&#xff0c;主要用于将大量的数据从各种数据源&#xff08;如日志文件、数据库、本地磁盘等&#xff09;采集到数据存储系统&#xff08;主要为Had…

计算机课设——基于Java web的超市管理系统

smbms_java_web 基于Java web的超市管理系统&#xff0c;数据库课程设计 1.引言 是一个基于Java Web连接MySQL的小项目。 超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目&#xff0c;逻辑层次分明&#xff0c;基础功能包括用户的登录和注销&#xff…

云手机结合自主ADB命令接口 提升海外营销效率

现在&#xff0c;跨境电商直播已经成为在线零售的重要渠道&#xff0c;在大环境下&#xff0c;确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口&#xff0c;为电商直播营销提供了技术支持&#xff0c;使得应用开发、测试、优化和运维更加高效。 什么是A…

鸿蒙语言基础类库:【@system.sensor (传感器)】

传感器 说明&#xff1a; 从API Version 8开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.sensor]。本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。该功能使用需要对应硬件支持&#xff0c;仅支持…