Java自动化测试实战:从JUnit5到Testcontainers与CI/CD
做Java开发这么多年自动化测试一直是我最看重的一块。不是说代码写得漂亮就完事而是改动代码之后有没有一套东西能快速告诉你“这次没搞坏别人”这决定了你敢不敢持续重构、敢不敢频繁发版。Java自动化测试这件事用一句话概括就是用一套可重复、可验证的脚本去替代人肉点点点把质量把关的时间从“发布前一天”提前到“代码提交的瞬间”。这篇文章适合刚接触自动化测试的Java工程师也适合已经在写单测但总感觉不得要领、想在集成测试和CI环节再往前推一步的人。我会把分层思路、框架选型、实操代码和踩坑经验一起讲清楚。1. 从测试金字塔说起Java自动化测试为什么必须分层1.1 单测、集成测试、端到端测试三层金字塔到底怎么切分很多团队一上来就把Selenium当成救命稻草恨不得所有功能都通过浏览器自动化去覆盖。结果往往是脚本跑一次要半小时改个页面结构崩一片维护成本高到想砍人。我在早期项目里也干过这种事后来才知道自动化测试应该按测试金字塔来切分底座是数量最多、运行最快的单元测试中间是集成测试塔尖才是数量最少、成本最高的端到端测试。测试金字塔的核心逻辑很简单越底层的测试运行越快、定位越准、维护越便宜越上层的测试越接近用户真实使用场景但也越慢、越脆。一个健康的Java项目单测数量应该占70%以上集成测试占20%左右端到端测试最多占10%。如果你发现团队里80%的自动化脚本都跑在UI层那你大概率是在用最贵的方式做质量保障这跟用火箭炮打蚊子是一个道理。这里要特别提醒一下很多人分不清“集成测试”和“端到端测试”。集成测试关心的是模块之间的契约比如Service层调用Repository层、HTTP客户端调用外部API这些交互符合预期就够了端到端测试则是从用户入口开始完整走一遍业务链路比如打开下单页面、填数据、提交、查数据库确认全流程没问题。前者可以在本地环境快速跑后者往往需要依赖中间件甚至第三方环境稳定性天然差一截。分层还有一个隐藏好处就是排障效率。单测挂了你基本能一眼定位到哪个方法出了问题端到端测试挂了你可能要花半小时去看是环境问题、数据问题还是真Bug。把大多数测试放在底层本质上是把“找问题”的成本降下来。1.2 选JUnit 5还是TestNG技术选型的板凳要坐稳Java自动化测试里框架选型是第一道坎。目前主流就是JUnit 5和TestNG两派。很多人上来就问“哪个好”我的答案是看场景但默认选JUnit 5。JUnit 5是JUnit家族的最新版本跟JUnit 4相比变化非常大。它把整个平台拆成了JUnit Platform、JUnit Jupiter、JUnit Vintage三层Platform负责启动测试框架Jupiter是全新的编程模型Vintage用来兼容老项目里的JUnit 4用例。这种拆分意味着你可以用JUnit 5跑各种不同风格的测试甚至接入其他测试引擎。如果你在一个Spring Boot项目里做常规的单元测试和集成测试JUnit 5几乎是零成本上手因为Spring Boot Test模块默认就是基于JUnit 5的。注解清晰断言API丰富还有参数化测试这种高频刚需写起来非常顺手。TestNG也有它的优势。它最出名的是并发支持强、测试分组灵活适合做大型接口自动化测试套件。比如你有一千个API用例想按业务模块分组执行或者让不同模块的用例并行跑TestNG的配置能力会更强。如果你做的不是典型Spring项目而是纯接口自动化工程TestNGSelenium或者TestNGRestAssured都能玩得很顺。我的建议是新项目优先JUnit 5老项目已经用TestNG的也别急着迁移工具是服务目标的团队哪个熟就用哪个别为技术情怀埋坑。另外JUnit 4的项目最好逐步升级到JUnit 5毕竟新特性都在Jupiter这边长期停留在老版本会越来越难受。2. 单元测试质量地基怎么打2.1 JUnit 5核心用法生命周期、断言与参数化单元测试是金字塔的底座它的目标是测“一个类里的一个方法”不启动Spring容器不连数据库不依赖外部服务。纯Java环境下JUnit 5就是最趁手的工具。先看生命周期注解。JUnit 5用一套清晰的注解管理测试实例的创建和销毁BeforeAll所有测试方法执行前运行一次必须修饰静态方法适合做全局初始化。AfterAll所有测试方法执行后运行一次同样必须是静态方法适合做全局清理。BeforeEach每个测试方法执行前都运行适合初始化测试对象。AfterEach每个测试方法执行后都运行适合释放资源。我见过不少初学者把耗时的初始化逻辑放在BeforeEach里结果几百个测试用例跑下来光初始化就浪费了十几秒。如果初始化逻辑跟某个测试方法的状态无关就放到BeforeAll里能省不少时间。断言是单测的灵魂。JUnit 5的Assertions类提供了非常丰富的断言方法assertEquals、assertTrue、assertFalse、assertNull、assertNotNull这些是基本功。有两个容易被忽略的assertAll可以把多个断言打包即使其中一个失败也会继续执行完所有断言最后统一报告失败项。用它的好处是你一次能拿到所有失败点而不是修完一个错误再跑一次。assertThrows显式验证方法抛出了预期异常。比如测试一个参数校验方法传非法值时应该抛IllegalArgumentException用assertThrows能把异常对象接住再对异常消息做二次断言。参数化测试是个高频刚需。同一个方法可能有几十组输入要验证如果每组都写一个Test方法代码冗余得可怕。JUnit 5的ParameterizedTest配合ValueSource、CsvSource或MethodSource可以一组数据跑一次测试。举个例子测试一个金额格式化工具可以这样写ParameterizedTest CsvSource({ 1000, 1,000.00, 1000000, 1,000,000.00, -500, -500.00 }) void testFormatAmount(BigDecimal input, String expected) { String result AmountFormatter.format(input); assertEquals(expected, result); }CsvSource里的每一行对应一次测试调用核心断言只写一遍数据的扩展就变得极其简单。这样写不仅代码量少而且新增测试数据几乎零成本测试覆盖率也跟着上来了。2.2 Mockito与解耦设计mock、stub、spy别混着用单元测试有个铁律被测对象依赖的协作对象一律不碰真实实现。因为一旦依赖了数据库、网络、文件系统你的测试就跑不快而且结果不稳定。这时候就需要Mockito上场。Mockito是目前Java世界里最主流的mock框架。最基本的用法是创建mock对象并设置它的行为UserRepository userRepository mock(UserRepository.class); when(userRepository.findById(1001L)).thenReturn(Optional.of(user));这句代码的意思是当调用findById(1001L)时直接返回一个预设的OptionalUser完全不访问数据库。这样你就能把测试焦点完全放在被测类上。很多人容易把mock、stub、spy三个概念混在一起。我的理解是stub桩是“替身演员”只负责返回预设结果不关心你是否调用了它。mock模拟对象不仅会返回预设结果还能验证交互比如“这个方法到底被调用了没有”“调了几次”。spy间谍对象是“真实对象的带监控版本”它默认调用真实方法但你也可以只覆盖其中某个方法。实际操作中verify是Mockito里最容易被忽视的利器。比如你写了一个发通知的服务它内部调用了消息推送客户端你想确认“当订单状态变为已支付时确实调用了一次推送方法”就可以这样写verify(notificationClient, times(1)).sendPaidNotification(orderId);如果这里一次都没调用或者调了两次测试就会失败。这种对“行为”的验证比单纯断言返回值更能保护业务逻辑。Mockito还有一个高频场景是静态方法mock。从Mockito 3.4.0开始可以通过mockStatic来mock静态方法但说实话静态方法mock往往意味着代码设计有问题。如果业务代码里大量直接调用静态工具类、静态工厂测试时就要费劲去mock这不是测试的问题是代码的坏味道。优先考虑把静态依赖改成实例注入代码的可测试性会大幅提升。3. 集成测试与接口自动化实操把真环境管住3.1 Spring Boot集成测试容器启动节奏要控制住单元测试测的是“孤岛”集成测试测的是“岛屿之间的桥梁”。在Spring Boot项目里最常见的就是用SpringBootTest启动完整的Spring容器再往里注入真实Bean去做测试。但这里有个大坑启动一个完整Spring容器非常耗时如果每个测试类都SpringBootTest整个测试套件跑完可能要花十分钟以上。解决方案是“按需裁剪上下文”。Spring Boot Test提供了一系列切片注解专门用来加载最小化的上下文。WebMvcTest只启动Web层自动装配Controller、过滤器、拦截器不加载Service和Repository适合测接口参数校验、路径映射、JSON序列化。DataJpaTest只启动JPA相关的Bean默认使用内嵌数据库替换真实数据源适合测Repository层的CRUD和自定义查询。JsonTest只测JSON序列化和反序列化。RestClientTest专门测RestTemplate或WebClient的行为。切片的思路是用什么测什么。测Controller就用WebMvcTest配合MockBean把Service层Mock掉测Repository就用DataJpaTest专注SQL和映射逻辑。这样既保证了测试范围不跑偏也让执行速度快了几个量级。等到真正需要端到端验证业务链路时再用SpringBootTest(webEnvironment RANDOM_PORT)启动完整容器。RANDOM_PORT表示每次启动一个随机端口避免测试并发时端口冲突这也是很多项目踩过的坑。直连固定端口在多人开发、CI并行时极其容易出现“端口被占用”的诡异问题。3.2 接口自动化测试RestAssured让HTTP断言变得可读接口自动化测试是Java自动化测试里最实用的一块。它不依赖页面直接发HTTP请求验证响应速度快得多稳定性也高得多。RestAssured是目前用得最多的Java HTTP测试库它的链式语法非常贴近自然语言读起来就像在描述一个HTTP请求。一个典型的REST API测试长这样given() .baseUri(http://localhost:8080) .contentType(ContentType.JSON) .body({\productId\: 1001, \quantity\: 2}) .when() .post(/api/v1/orders) .then() .statusCode(201) .body(orderId, notNullValue()) .body(totalAmount, equalTo(299.98f));这段代码拆开看given()里放请求前置条件比如Header、请求体、认证信息when()里放HTTP方法then()里放响应断言。顺序和语义跟实际请求完全吻合可读性极强。接口测试里最需要管住的是“数据状态”。你测一个查询订单接口如果每次跑测试前测试环境里的订单数据都是随机的那断言就没有确定性。我的习惯是用“测试前准备、测试后清理”的模式每次测试一开始创建专用测试数据结束无论成功失败都删掉。如果依赖了外部下游服务优先用MockServer或者契约测试把下游固定住不要让自己的测试看下游的脸色。这里还推荐一个实践把API测试也纳入代码仓库管理跟开发代码走同一条CI流水线。很多团队把接口自动化单独放在一个工程里久了就没人维护、用例全红。把测试放在业务项目里开发改接口时自然就会同步更新测试这个“物理距离”越小维护成本越低。3.3 数据库与依赖隔离Testcontainers是进阶标配集成测试一旦涉及到真实数据库最常见的方案有两个内嵌数据库和Testcontainers。内嵌数据库比如H2胜在启动快、零依赖但有一个隐患H2的SQL方言和真实数据库比如PostgreSQL或MySQL有差异一些生产环境的SQL特性在H2上根本测不出来。这种“测试环境是绿的上了生产就崩”的案例我见过不止一次。Testcontainers解决的就是这个问题。它的思路是在测试运行时用Docker启动一个真实的数据库容器测试结束自动销毁。你在测试里看到的是真实数据库行为SQL方言、事务特性、索引行为全都能对齐生产环境。用起来也不复杂JUnit 5集成已经封装得很好Testcontainers class OrderRepositoryTest { Container static PostgreSQLContainer? postgres new PostgreSQLContainer(postgres:16-alpine) .withDatabaseName(testdb) .withUsername(test) .withPassword(test); DynamicPropertySource static void datasourceProperties(DynamicPropertyRegistry registry) { registry.add(spring.datasource.url, postgres::getJdbcUrl); registry.add(spring.datasource.username, postgres::getUsername); registry.add(spring.datasource.password, postgres::getPassword); } }这里的核心思想是用动态配置覆盖Spring Boot的数据源属性让被测应用完全相信它连接的就是一个普通PostgreSQL实例实际上这个实例是在Docker里临时创建的。Testcontainers虽然优雅但CI环境必须支持Docker。如果你的CI跑在容器里还要配置Docker-in-Docker或者用Sidecar模式让测试容器共享宿主机的Docker引擎。这些都是上线前就要提前确认的。4. 自动化测试与CI/CD结合让测试成为发布的门卫4.1 覆盖率统计与质量门槛JaCoCo怎么用才不虚高测试写得再多如果不知道覆盖率你其实是盲飞。覆盖率工具能告诉你“哪些代码被测试执行到了”帮你找到没被保护的角落。JaCoCo是Java生态最常用的覆盖率工具集成起来非常简单。在Maven的pom.xml里加上JaCoCo插件后执行mvn test就会自动生成覆盖率数据。我一般会把覆盖率报表集成到CI的构建产物里每次构建都能看到一份清晰的HTML报告哪些行没覆盖到、哪些分支没走通一目了然。但覆盖率数值本身要理性看待。我一直强调两个原则第一行覆盖率只是一个参考线真正要关注的是“关键业务分支”有没有走到第二覆盖率门槛定得太高会让团队为了凑数字而去写大量无效断言这就本末倒置了。如果要设置质量门槛我建议按模块分规则。核心交易逻辑、支付逻辑、权限控制这些模块行覆盖率要求高一点比如80%以上普通CRUD模块可以放宽到60%。JaCoCo的check规则可以精确到类通过规则配置就能实现这种差异化门槛plugin groupIdorg.jacoco/groupId artifactIdjacoco-maven-plugin/artifactId version0.8.12/version executions execution iddefault-check/id goals goalcheck/goal /goals configuration rules rule elementBUNDLE/element limits limit counterLINE/counter valueCOVEREDRATIO/value minimum0.80/minimum /limit /limits /rule /rules /configuration /execution /executions /plugin注意JaCoCo的check目标需要跟prepare-agent配合使用否则覆盖率数据不会自动注入到JVM里。如果配置完发现覆盖率一直是0多半就是漏了prepare-agent这个执行阶段。4.2 测试并行化从半小时到五分钟的提速实践自动化测试最容易被诟病的就是“跑得慢”。单测还好一旦集成测试和API测试多起来串行执行就会变成发布流程的瓶颈。解决思路就是并行化。Maven里用Maven Surefire插件跑单元测试启用并行很简单plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration parallelmethods/parallel threadCount4/threadCount useUnlimitedThreadsfalse/useUnlimitedThreads /configuration /pluginparallel可以配置为methods或classes。classes模式是不同测试类并行跑隔离性更好methods模式是同一个类里的测试方法并行跑提速更明显但要求测试方法之间不能有共享状态。这里要特别小心并行测试最怕的就是共享资源。如果你的测试用例里写了同一个静态文件、用了同一个测试数据库里的同一条记录那并行跑起来就会间歇性失败。我遇到过最磨人的一个Case就是两个测试类同时操作Redis里的同一把分布式锁序列化跑怎么都对一并行就偶发超时。所以启用并行前先做两件事检查所有单测是否有共享状态集成测试的数据库和Redis是否支持并发访问。如果数据源是Testcontainers每个测试容器都是独立实例天然支持并行这也是我推荐它的另一个原因。另外很多项目其实卡在“编译打包”和“启动Spring上下文”上。这时可以考虑把测试按类拆分到多个JVM进程上跑利用Maven的forkCount和reuseForks参数分配多个fork本质上就是几组测试同时在不同的JVM里执行彻底避免线程间的资源串扰。不过这种方式对内存要求更高CI节点配置要跟上。5. 常见问题与排查技巧实录这些坑我都替你踩过5.1 我踩过的最痛的几个坑自动化测试写起来不难难的是让它稳定、可靠地一直跑下去。下面这几个坑是我真实踩过的每一个都花了不少时间才爬出来。第一个坑是测试数据相互污染。最早做接口自动化时我用一套共享的测试数据库多条用例都调用“创建订单”接口然后按订单号查询。跑着跑着就发现只要用例执行顺序一变后面的用例就查不到数据了。后来我改成“每条用例创建独立数据用完即删”同时给测试数据加上固定前缀问题立刻消失。共享数据看起来省事实际上是自动化测试稳定性的最大敌人。第二个坑是sleep等待。早期写Selenium脚本时页面跳转后习惯性Thread.sleep(3000)等元素加载结果本地跑得好好的CI一慢就不稳定。后来全部改成显式等待比如WebDriverWait配合“元素可点击”条件彻底不用拍脑门猜时间。第三个坑是静态方法滥用。项目里有个全局配置类所有方法都是静态的单测里到处需要mock静态方法。Mockito虽然支持mockStatic但每测一个类都要处理静态mock的开关和关闭繁琐且容易漏。最严重的一次漏关了静态mock导致后面执行的测试全被污染报了一堆莫名其妙的状态错误。后来我推动重构把全局配置改成依赖注入的单例测试立刻清爽了。第四个坑是环境相关的断言。有些同事写完API测试后直接在断言里写死了服务器IP、端口甚至内网域名结果在本地跑不过CI也跑不过只有特定环境才能过。这种测试本身就是定时炸弹。所有环境信息一律通过配置下发测试代码里不允许出现具体IP和端口。5.2 自动化测试问题排查速查表我在带团队时经常让新人先看这张表再动手排查效率会高很多。典型现象可能原因排查思路与解决办法测试偶发性失败共享状态、随机顺序、时序未控制开启测试重试机制定位不稳定用例检查是否依赖共享数据库/Redis/文件并行执行后大量失败用例间共享数据或静态变量将并行模式从methods切换为classes为每个测试类准备独立数据覆盖率始终为0漏配prepare-agent或argLine被覆盖确认JaCoCo的prepare-agent目标已绑定到initialize阶段检查最终执行的argLineSpring容器启动很慢过度使用SpringBootTest用WebMvcTest、DataJpaTest切片代替完整上下文测试里数据库数据被篡改测试操作了公共数据明确测试数据专用账号每条用例使用唯一标识符测试结束执行清理接口测试断言不稳定下游服务响应变化用MockServer模拟下游或引入契约测试固定协议CI构建内存不足fork进程数过多调低forkCount或加大CI节点内存分配本地通过但CI失败操作系统、端口、环境变量不一致把测试环境容器化统一镜像与运行环境这张表我建议打印出来贴在工位旁边。遇到测试问题先对号入座很多时候不是逻辑错了而是测试自身“环境不干净”。5.3 一个很实用的末位排查心法最后分享一个排除测试稳定性的心法当一套测试前几次全绿、后几次随机红时不要急着改业务代码先把执行日志调成DEBUG级别重点看几个地方测试数据是否包含上一次运行的残留、线程池里是否有未回收的任务、临时文件是否被清理、静态单例是否被污染。我有一次排查一个偶发超时的用例查了两天才发现是某个工具类里的静态Map被一个测试用例写入了脏数据导致后来的用例读取到错误配置。这种问题隐蔽性极强因为它跟被测业务逻辑毫无关系完全是被测试代码“自己坑自己”。自动化测试做到后面真正难的不是写用例而是维护用例的稳定性。凡是让测试“看运气”的因素都要坚决消灭掉。测试的价值在于确定性一个偶红偶绿的测试套件比没有测试还糟糕——因为它会在关键时刻消耗你最宝贵的时间还让你逐渐不再信任自动化。宁可用例少一点也得保证每一条都稳定可复现。Java自动化测试这条路没有捷径但有章法先分层、再选型、勤隔离、常维护质量自然会长在你的代码里。

相关新闻

CPU工作原理与性能选型:从指令周期到流水线、缓存实战解析

CPU工作原理与性能选型:从指令周期到流水线、缓存实战解析

1. 结构决定行为:先把CPU当成一个“万能翻译官”一开始接触CPU这个概念的时候,很多人容易被“中央处理器”这几个字吓住,觉得它神秘得不得了。其实换个角度理解,CPU就是一台电脑里的“翻译官总调度”:它本身根本不存储…

2026/10/18 22:17:34 阅读更多 →
C#零依赖DICOM查看器:窗宽窗位、多帧序列与像素级缩放实现

C#零依赖DICOM查看器:窗宽窗位、多帧序列与像素级缩放实现

简介:本资源是一个基于C#开发的DICOM医学影像查看器演示项目,面向医疗信息化开发者、医学图像处理初学者及高校相关专业学生,解决DICOM文件解析、多帧图像渲染、元数据读取与基础图像处理等核心问题。项目完整包含412个文件,涵盖3…

2026/10/18 22:17:34 阅读更多 →
PDFViewer OCX:C#与C++桌面端本地PDF渲染控件实战指南

PDFViewer OCX:C#与C++桌面端本地PDF渲染控件实战指南

简介:PDFViewer OCX是一款面向C#、C及Web开发者的轻量级PDF嵌入式控件,专为在桌面应用与传统IE浏览器环境中快速集成PDF查看、交互功能而设计,有效规避对Adobe Reader等外部依赖。资源包共82个文件,涵盖12个C头文件(h&…

2026/10/18 22:17:34 阅读更多 →

最新新闻

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

【免费下载链接】InternVL2_5-78B-MPO 项目地址: https://ai.gitcode.com/OpenGVLab/InternVL2_5-78B-MPO 点击查看 免费下载 InternVL2_5-78B-MPO 是一款基于 ViT-MLP-LLM 架构的开源多模态大模型,融合了 6B 视觉编码器 InternViT 与 72B 语言模型 Qwe…

2026/10/18 23:08:17 阅读更多 →
定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

简介:这是一份阿里140-n值纯算生成逻辑的代码解析包,面向反爬虫工程师、前端加密研究者与算法学习者。包内完整呈现n值生成全链路:从自定义base64加密算法入手,逐步拆解Ye、ke、B、u四个核心数组的来源与组装规则,涵盖…

2026/10/18 23:08:17 阅读更多 →
无监督深度单应性估计:PyTorch实战与几何建模原理

无监督深度单应性估计:PyTorch实战与几何建模原理

1. 项目概述:为什么“无监督深度单应性估计”值得你花30分钟认真读完“Unsupervised Deep Homography - Pytorch实现”——这个标题里藏着计算机视觉领域一个非常典型的“理想与现实撕扯点”。单应性(Homography)是什么?简单说&am…

2026/10/18 23:08:17 阅读更多 →
AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

简介:面向机械臂视觉抓取开发者的可运行源码包,整合aubo i5机械臂与Intel RealSense D435i深度相机的识别抓取实践。压缩包仅6KB,内含3个文件,以html说明与inscode工程配置为主,附带gitignore版本管理配置,…

2026/10/18 23:08:17 阅读更多 →
Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

目录 一、 Agent Skill入门 1.1 Agent Skill 到底是什么? 1.2 Agent Skill长什么样? 1.2.1 文件架构 1.2.2 SKILL.md文件格式 (1) Frontmatter字段 (2) Body content 1.2.3 Skill Demo 二、怎么用Agent Skill? 2.1 安装Agent 2.2 …

2026/10/18 23:08:17 阅读更多 →
推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:07:17 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →