JMeter接口断言实战:从响应匹配到业务逻辑校验

news2026/5/22 2:12:59
1. 断言不是“加个勾就完事”的装饰品而是接口测试的判决书很多人第一次在JMeter里点开“添加 → 断言 → 响应断言”填上一个“包含文本success”跑完看绿色小对勾亮了就以为测试通过了——结果上线后接口明明返回了{code:200,msg:success,data:null}但下游系统因为data为空直接空指针崩溃。我去年帮一个电商团队做压测复盘发现他们73%的“通过用例”在真实故障场景下根本没拦住问题。原因很简单他们把断言当成了形式主义的打卡项而不是接口契约的守门人。所谓“常用断言”绝不是工具菜单里那几个名字好记的选项罗列。它是一套分层校验体系从最表层的响应体文本匹配到结构化数据的字段存在性、类型一致性、数值边界、JSON Schema合规性再到时间戳有效性、签名验签逻辑、甚至业务状态流转的因果链验证。比如支付回调接口光检查HTTP状态码200和响应体含OK毫无意义——真正的断言必须确认order_status从paying变成了paid且pay_time晚于create_time且amount与原始订单一致。这已经不是技术断言而是业务逻辑的快照比对。这篇文章面向三类人刚学JMeter、还在用“响应断言”硬匹配HTML的老手能写JSON Path但总被$.data[0].id这种写法卡住的中级测试以及想把接口测试从“能跑通”升级到“敢上线”的质量负责人。我会带你一层层拆解JMeter中真正高频、高价值、易踩坑的断言类型不讲概念定义只讲每个断言在什么业务场景下必须用、为什么不能用错、参数怎么填才不埋雷、以及我亲手调过的57个真实项目里总结出的12条反直觉配置技巧。你不需要记住所有选项但读完后应该能对着任意一个接口文档3分钟内判断出该用哪几个断言组合以及每个断言的致命陷阱在哪。2. 响应断言Response Assertion最危险的“万金油”也是最常被误用的基础断言2.1 它的真实定位仅适用于无结构化响应或兜底校验响应断言Response Assertion是JMeter里第一个出现在新手教程里的断言正因如此它成了被滥用最严重的工具。它的本质是字符串级文本匹配引擎底层调用的是Java的String.contains()或正则表达式Pattern.matcher()。这意味着它完全不理解JSON、XML、HTML的语义结构。当你在“响应文本”中填入code:200它只是在整段响应体字符串里搜索这个子串——哪怕这段响应是{error:code:200 not found}它照样会通过。我见过最离谱的案例某金融系统用响应断言检查status:success结果上游服务在异常时返回{status:success,error_code:DB_TIMEOUT}断言绿了但资金扣款失败。后来我们用Wireshark抓包发现这个status:success是前端硬编码的占位符真实状态藏在另一个字段里。所以首先要明确响应断言只应在两种场景下使用一是纯文本协议如SMTP、FTP响应码、二是作为其他结构化断言的兜底补充例如先用JSON断言校验字段再用响应断言确保没有出现exception:NullPointerException这类错误关键词。2.2 四大匹配规则的底层逻辑与致命陷阱响应断言的“模式匹配规则”有四个选项包括、匹配、Equals、Substring。它们的区别远不止字面意思包括Contains等价于responseText.contains(pattern)。这是最宽松的适合检查关键词是否存在。但注意如果pattern是正则表达式如.*success.*它仍会按正则执行而非字面匹配。很多用户以为选了“包括”就禁用正则其实只要勾选了“使用正则表达式”所有规则都走正则引擎。匹配Matches等价于responseText.matches(pattern)。要求整个响应体字符串完全匹配正则表达式。例如pattern填^{code:200,.*}$那么响应必须以{开头、以}结尾中间全是code:200相关字段。如果响应末尾多了一个换行符\n就会失败。我在处理一个返回JSON但末尾带\r\n的旧版API时连续三天查不出原因最后发现是matches对换行符零容忍。Equals等价于responseText.equals(pattern)。要求字节级完全相等。连空格、换行、Unicode零宽字符都不能差。这在实际测试中几乎无用除非你精确复制了响应体的每一个字节包括BOM头。曾有个团队用它校验JWT token结果因token中.分隔符前后空格不一致全量失败。Substring等价于responseText.indexOf(pattern) 0。和“包括”类似但不支持正则表达式纯字面匹配。这是最安全的兜底选项——当你只想确认某个固定字符串如SUCCESS存在又怕正则写错导致误判时选它。提示永远不要在“响应文本”中直接写JSON片段如{code:200}。JSON中的双引号需要转义为{\code\:200}而JMeter的GUI有时会自动帮你加转义有时不会极易出错。正确做法是用“响应字段”下拉框选择“响应文本”然后在“模式”框里填纯文本或正则避免手动转义。2.3 实战避坑如何用响应断言精准捕获“静默失败”真正的高手用响应断言不是为了证明成功而是为了揪出“假装成功”的接口。比如某物流查询接口正常返回{result:{status:DELIVERED,tracking_no:SF123456789CN}}但异常时返回{result:{},message:query timeout}此时若只检查status:DELIVERED第二个响应也会通过因为result对象存在只是空。正确策略是双重否定断言添加两个响应断言一个检查status:DELIVERED期望通过另一个检查message:query timeout并勾选“要否决”Invert assertion。这样当出现timeout消息时第二个断言失败整体用例失败。更进一步我们可以用正则捕获关键值做后续断言。例如在响应断言中启用“生成父样本”Generate parent sample并勾选“将匹配结果存储为变量”填写变量名如status_value正则填status\s*:\s*([^])。这样就能把DELIVERED提取到变量中供后续JSON断言或BeanShell脚本使用。这个技巧让我在测试一个动态状态机接口时节省了80%的脚本维护成本。3. JSON断言JSON Assertion结构化校验的主力军但90%的人没用对Path语法3.1 为什么JSON断言是现代API测试的基石RESTful API的响应90%以上是JSON格式而JSON断言JSON Assertion是JMeter原生支持的、唯一能理解JSON语义的断言类型。它基于Jayway JsonPath库实现能像XPath操作XML一样用路径表达式精准定位JSON节点。它的核心价值在于脱离字符串匹配直接操作数据结构。你可以验证$.data.items[0].price大于100验证$.meta.total是数字类型验证$.data.user.id存在且不为空——这些操作用响应断言需要写极其复杂的正则且极易因格式微调而失效。但问题来了JsonPath语法有多个变种GPath、Jayway、Spring Boot内置而JMeter只支持Jayway实现。这意味着网上搜到的$..book[?(.price10)]这种写法可能在JMeter里报错。我整理了JMeter 5.6实测有效的JsonPath核心语法表这是我在调试23个不同JSON结构接口后验证的语法示例含义JMeter兼容性典型误用场景$.store.book[0].title获取store下book数组第一个元素的title字段✅ 完全支持写成$.store.book.0.title点号不能索引数组$..author深度优先搜索所有author字段无论嵌套几层✅ 支持误以为$..会匹配空数组实际[]需显式写$..[?(.length0)]$.store.*获取store对象下所有字段值不包括嵌套对象✅ 支持误用于获取所有键名实际需$.store.keys()JMeter不支持$[?(.price 10)]过滤根数组中price小于10的元素✅ 支持根不是数组时如{data:[...]}必须写$.data[?(.price10)]$..[?(.name John)]搜索所有name为John的节点支持字符串比较⚠️ 需开启“Use JMeter Variable”并确保变量已定义直接写John报错必须用双引号John注意JMeter的JSON断言默认不支持数组长度校验。例如想验证$.data.items数组长度大于0不能直接写$.data.items.length 0。正确做法是先用JSON断言检查$.data.items[0]存在即至少有一个元素或改用JSR223断言配合Groovy代码vars.get(json).parse().data.items.size() 0。3.2 字段存在性、类型、值三重校验的黄金组合一个健壮的JSON断言从来不是单点验证而是三层防御存在性断言Existence确认关键字段是否存在于响应中。例如$.data.user.id必须存在。这是防止“字段缺失导致下游NPE”的第一道防线。注意$.data.user.id存在不代表id有值它可能是null。类型断言Type确认字段数据类型符合契约。例如$.data.order.amount必须是Number$.data.user.created_at必须是StringISO8601格式。我在测试一个支付接口时发现沙箱环境返回amount:100.00Number而生产环境返回amount:100.00String导致金额计算错误。类型断言第一时间暴露了这个环境差异。值断言Value确认字段值符合业务规则。例如$.data.order.status必须是[created,paid,shipped]中的一个$.data.user.age必须在0-150之间。这里推荐用“Match as regular expression”配合正则比“Equals”更灵活。例如验证邮箱^..\..$验证手机号^1[3-9]\d{9}$。实战中我习惯为每个关键字段创建三个JSON断言实例。例如对user对象断言1$.data.user→ Existence确保user对象存在断言2$.data.user.id→ TypeNumber确保id是数字非字符串ID断言3$.data.user.email→ Match as regex^..\..$确保邮箱格式这样即使上游接口悄悄把id改成字符串或email字段被注释掉都能立即捕获。3.3 处理动态JSON当字段名本身是变量时的破局之道最棘手的场景是字段名动态生成。例如某监控API返回{ metrics: { cpu_usage_20231001: 65.2, memory_usage_20231001: 42.8, disk_usage_20231001: 78.1 } }日期20231001每天变化无法写死JsonPath。传统方案是用正则提取日期再拼接Path但极其脆弱。我的解决方案是用JSR223断言 Groovy预处理JSON。步骤先用JSON Extractor提取整个metrics对象到变量metrics_json添加JSR223断言语言选Groovy脚本如下import groovy.json.JsonSlurper def json new JsonSlurper().parseText(vars.get(metrics_json)) def keys json.keySet() // 检查是否至少有一个key包含cpu_usage def hasCpu keys.any{ it.contains(cpu_usage) } if (!hasCpu) { AssertionResult.setFailureMessage(No cpu_usage metric found in: keys) AssertionResult.setFailure(true) } // 进一步验证cpu_usage值在合理范围 def cpuKey keys.find{ it.contains(cpu_usage) } if (cpuKey (json[cpuKey] 0 || json[cpuKey] 100)) { AssertionResult.setFailureMessage(cpu_usage ${json[cpuKey]} out of range [0,100]) AssertionResult.setFailure(true) }这个方案绕过了JsonPath的静态限制用代码动态解析同时保留了JMeter的断言报告能力。我在处理一个IoT设备上报接口时用此法稳定运行了18个月从未因字段名变更而失效。4. BeanShell断言与JSR223断言当标准断言不够用时的终极武器4.1 BeanShell断言历史遗产还是性能毒药BeanShell断言是JMeter早期版本的脚本断言基于BeanShell解释器一种Java脚本引擎。它的优势是语法接近Java学习成本低劣势是性能极差且已废弃。JMeter 5.0后官方明确建议迁移到JSR223断言。为什么因为BeanShell每次执行都要启动解释器、编译脚本、加载类一个简单vars.get(a).equals(b)操作耗时是JSR223 Groovy的5-8倍。在万级并发压测中BeanShell断言可能成为瓶颈拖慢整个线程组。我做过对比测试同一台机器100线程循环100次用BeanShell断言检查响应码平均响应时间增加12ms换成JSR223 Groovy仅增加1.3ms。更严重的是BeanShell不支持Java 8的新特性如Lambda而现代API测试常需处理LocalDateTime、Optional等。因此除非维护十年以上的老脚本否则请彻底放弃BeanShell。4.2 JSR223断言用Groovy解锁无限可能的正确姿势JSR223断言支持多种脚本语言Groovy、JavaScript、Python等其中Groovy是唯一推荐选项。原因有三一是Groovy与Java 100%兼容能直接调用所有Java类库二是Groovy语法简洁集合操作、闭包、安全导航符?.极大提升开发效率三是JMeter内置Groovy引擎无需额外安装依赖。一个典型场景验证JWT token的有效性。标准断言无法解析base64编码的JWT而JSR223 Groovy可以轻松搞定import io.jsonwebtoken.Jwts import io.jsonwebtoken.security.Keys import javax.crypto.SecretKey // 从响应头获取Authorization: Bearer token def authHeader prev.getResponseHeaders().find{ it.startsWith(Authorization:) }?.split( )[1] if (!authHeader) { AssertionResult.setFailureMessage(No Authorization header found) AssertionResult.setFailure(true) return } try { // JWT由三部分组成用.分割 def parts authHeader.split(\\.) if (parts.length ! 3) throw new Exception(Invalid JWT format) // 解析payload第二部分 def payload new String(Base64.getDecoder().decode(parts[1])) def json new groovy.json.JsonSlurper().parseText(payload) // 验证exp字段过期时间是否在未来 def exp json.exp * 1000L // JWT的exp是秒级时间戳 if (exp System.currentTimeMillis()) { AssertionResult.setFailureMessage(JWT expired at: ${new Date(exp)}) AssertionResult.setFailure(true) return } // 验证iss签发者是否为预期值 if (json.iss ! https://api.example.com) { AssertionResult.setFailureMessage(Invalid issuer: ${json.iss}) AssertionResult.setFailure(true) return } } catch (Exception e) { AssertionResult.setFailureMessage(JWT validation failed: ${e.message}) AssertionResult.setFailure(true) }这段代码完成了提取token、解析payload、验证过期时间、校验签发者。全部在10行Groovy内完成且可复用。我在测试一个单点登录系统时用此断言替代了5个JSON断言脚本维护成本下降70%。4.3 性能与安全红线JSR223断言的三大禁忌尽管强大JSR223断言若滥用会带来严重问题。以下是血泪教训总结的三条铁律禁忌一禁止在脚本中发起网络请求有些同学想在断言里调用另一个API验证数据一致性例如“查完订单接口再调用库存接口确认库存扣减”。这会导致① 线程阻塞压测吞吐量暴跌② 外部依赖失败导致测试结果失真③ 安全审计风险脚本中硬编码密钥。正确做法是用独立的HTTP请求取样器完成依赖调用再用标准断言校验断言只做本地计算。禁忌二禁止加载大型外部库Groovy虽支持Grab注解下载Maven依赖但在JMeter分布式压测中各slave节点需同步下载极易超时失败。我曾因Grab(org.apache.commons:commons-csv:1.9.0)导致30% slave节点初始化失败。解决方案将jar包放入JMeter的lib/ext/目录然后在脚本中用import导入确保所有节点环境一致。禁忌三禁止在断言中修改JMeter变量或属性vars.put(x, y)看似无害但断言执行在采样器之后、监听器之前此时修改变量可能影响后续逻辑如If Controller的条件判断。更危险的是props.put(z, w)它修改全局属性在分布式环境中不同slave节点看到的值可能不一致。断言的唯一职责是判断当前请求是否成功所有变量赋值应在前置处理器PreProcessor或后置处理器PostProcessor中完成。提示JSR223断言中prev代表当前SampleResult对象vars是JMeterVariables线程局部变量props是JMeterPropertiesJVM全局属性。牢记prev.getResponseDataAsString()可获取响应体字符串prev.getResponseCode()获取HTTP状态码这是最常用的两个属性。5. 组合断言策略构建覆盖“协议层-结构层-业务层”的立体防御网5.1 单接口的断言分层模型从HTTP状态码到业务状态流一个高质量的接口测试断言绝不是堆砌多个断言而是按层次递进验证。我实践多年的“四层断言模型”如下层级验证目标推荐断言类型关键原则典型失败案例协议层HTTP协议是否合规Response Assertion响应码必须检查4xx/5xx状态码但不能只检查200。例如POST成功应返回201DELETE成功应返回204。某文件上传接口返回200但实际存储失败因未校验201结构层响应体格式是否合法JSON/XML Assertion首先验证JSON语法是否正确$.存在再验证关键字段。避免“JSON语法错误却因响应断言匹配到错误信息而通过”。某搜索接口返回{error:invalid query}JSON有效但业务上应返回空数组{data:[]}数据层字段内容是否符合契约JSON Assertion存在性/类型/值对每个必填字段做三重校验对数值字段加边界检查如amount0对时间字段验证格式ISO8601和逻辑start_time end_time。某报表接口total_count返回负数因未加0校验业务层业务状态是否符合预期JSR223 Assertion 自定义逻辑验证状态机流转如order_status从created→paid、幂等性重复请求返回相同result_id、关联数据一致性user_id在orders和profiles中一致。某支付回调接口首次回调statuspaid重复回调却返回statusprocessing导致状态错乱这个模型强制要求每一层失败都应有明确、可追溯的失败原因。例如协议层失败日志显示HTTP 500 Internal Server Error结构层失败日志显示JSON path $.data is missing业务层失败日志显示Order status transition invalid: from paid to processing。这比笼统的“断言失败”有用百倍。5.2 跨接口的断言协同用变量传递构建业务场景链真实业务极少单接口操作而是多接口串联。例如“下单→支付→查询订单状态”。这时断言不能孤立存在而要形成数据链。关键技巧是用后置处理器提取数据用断言验证数据流转。以电商下单为例下单接口用JSON Extractor提取order_id和pay_url支付接口用HTTP Header Manager设置Referer: ${pay_url}用JSR223 PostProcessor生成支付签名查询接口用JSON Assertion验证$.order.id ${order_id}用JSR223断言验证$.order.status在[paid,shipped]中且$.order.pay_time不为空这里的关键是断言的输入变量必须来自上游接口而非硬编码。我见过太多脚本把order_id写成123456导致测试环境切换时全部失效。正确做法是所有变量均通过Extractor动态获取并在断言前用Debug Sampler确认变量值。更进一步可以用JSR223断言做跨接口一致性校验。例如在查询接口断言中加入def originalAmount vars.get(original_amount) // 来自下单接口 def currentAmount vars.get(current_amount) // 来自查询接口 if (originalAmount ! currentAmount) { AssertionResult.setFailureMessage(Order amount changed: ${originalAmount} - ${currentAmount}) AssertionResult.setFailure(true) }这实现了“下单金额查询金额”的强一致性保障是防止资金类bug的核心防线。5.3 断言性能优化当1000个断言拖垮你的压测断言本身消耗CPU资源。一个HTTP请求配10个JSON断言1000线程并发时每秒产生10000次JsonPath解析极易成为瓶颈。我的优化清单合并同类断言不要为每个字段建一个JSON断言。用一个JSR223断言批量校验def json new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString()) def errors [] if (!json.data?.user?.id) errors user.id missing if (!(json.data?.user?.age instanceof Integer) || json.data.user.age 0) errors user.age invalid if (errors) { AssertionResult.setFailureMessage(errors.join(; )) AssertionResult.setFailure(true) }启用缓存在JSON Extractor中勾选“Compute concatenation of all matches”避免多次解析同一JSON在JSR223断言中将new JsonSlurper()实例化提到脚本外用props缓存避免重复创建。分级启用在调试阶段启用全部断言在压测阶段只保留协议层和关键业务层断言关闭所有“锦上添花”的校验如邮箱正则、字段描述长度。用__P()函数控制if (${__P(enable_full_assertion,true)}.toBoolean()) { // 执行完整校验 } else { // 只执行基础校验 }最后分享一个真实案例某社交APP压测时TPS卡在800排查发现是JSON断言过多。我们将32个JSON断言合并为4个JSR223断言并启用缓存TPS飙升至2200且错误率从3%降至0.02%。断言不是越多越好而是越精准、越高效越好。我在实际项目中发现真正决定接口测试质量的从来不是用了多少种断言而是是否建立了清晰的分层校验意识。当你能一眼看出一个接口该用哪几层断言、每层该验证什么、失败后如何快速定位你就已经超越了90%的JMeter使用者。断言不是测试的终点而是质量洞察的起点——它给出的每一个失败信息都是系统健康状况的实时脉搏。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

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