测试用例模块化:从混乱到可持续维护的工程实践
很少有人愿意承认自己维护测试用例的时间比写新用例的时间还长。我踩过这个坑而且踩了不短一段时间测试脚本从一个文件变成十几个文件执行时间是快了但每次业务一改我就要逐个「捡弹壳」——跑到里面去抽丝剥茧找到那个因为改动而报废的用例。数据改一处翻一个用例接口返回加了字段又翻一片。后来我才意识到问题不是“写用例不够认真”而是从一开始就没把测试用例当成一套需要持续迭代的工程系统来设计。如果你也在为测试用例越改越乱、越维护越痛苦而头疼那这篇内容应该对你有用。我先说结论测试用例难维护的根源大多数情况下不是你不够细心而是用例缺少“模块化”的设计。没有拆解、没有分层、没有公共抽象所有逻辑搅在一起每一次业务变化都会把一整片用例拖下水。这篇内容会从现象、原理讲到实操步骤和排查技巧适合正在做接口测试、UI 自动化或者打算把测试代码体系重新整理一遍的测试同学参考。1. 为什么你的测试用例会越改越乱1.1 一个让所有人头疼的测试文件先看一个我反复见过的场景。某一次我要给一个订单接口补充测试打开同事留下的测试文件发现这个文件已经一千多行。前半部分是登录、拿 token、拼请求中间夹杂着各种硬编码的订单 ID 和用户手机号后半部分是一长串test_xxx函数每个函数都要从头构造一遍完整的请求数据有的函数还把数据库里某个字段的值直接写在断言里。当时我改一个字段前后要牵扯注册用户的那套代码、造订单数据的一段逻辑、还有几个断言里的幻数。改完本地跑一遍挂了三个用例我还得逐个看失败原因发现有两个失败根本不是因为业务变更而是公共数据被前一个用例改了。这就是典型的“测试代码与业务逻辑、数据完全耦合”的形态。只要业务逻辑调整、数据结构变化或者仅仅是测试数据的初始化顺序有变动整片用例就会跟着崩。为什么会出现这种情况很常见的一个原因是大家早期写测试时图快习惯把“能用”当成“能用得好”。第一次写的时候文件还没有那么大公共逻辑直接复制粘贴也就几行等到用例数量从几十个涨到几百个再回头处理这些复制粘贴出来的代码已经不知道从哪里下手。1.2 测试用例腐化的三个典型表现我总结了一下测试用例开始“腐化”的时候通常会有下面三个信号。第一重复代码爆炸。同一个“构造用户数据”的方法在 80% 的用例里都能找到只是因为某个用例多传了一个参数大家就复制了一份变种。这种重复意味着当数据结构变化时你至少要修改 N 处地方而不是 1 处。就算用查找替换也很容易漏掉某个角落里的变体。第二数据与用例深度耦合。用例里写死了环境地址、账号、订单号、手机号断言里写死了数据库的某些字段数值。如果数据变了你要先翻代码找到那个硬编码再找到它在哪些用例里被引用。更麻烦的是如果多个用例共享一个全局变量某个用例修改之后会影响下一个用例的执行结果。第三用例之间互相依赖。有的用例必须先执行登录登录之后才能执行下单下单之后才能执行支付。整个用例序列是单向链条式的一旦链条中间的某一步挂了后面所有用例都是红灯。这种串联在 UI 自动化里尤其常见表面上跑得通但只要环境一重置或者用例单独执行某一项马上报错。1.3 到底是谁把用例写成这样的我并不是要说“写测试的人偷懒”。测试用例腐化更多是结构设计和迭代节奏的问题。从设计角度看很多人没有把测试代码当成一个和业务代码同等重要的工程来看待。写业务代码时你可能会考虑分层、依赖注入、抽象接口写测试代码时就默认它是“一次性脚本”怎么顺手怎么来。测试代码一旦被当成一次性脚本它就不会考虑扩展性和可读性。从迭代节奏看测试用例的维护往往是被业务需求推着走的。业务变更来了测试同学的第一反应是“赶紧改用例跑回归”而不是“我借这个机会把用例结构理顺”。每一次都只整改报错的那个函数不动其他地方。改动多了以后代码里就容易出现“新风格和旧风格混搭”的局面修不完改不动重新写又舍不得。坦白说我也在这种节奏里吃过亏。后来某次老项目要整体迁移到新的环境我被迫把所有用例从头到尾捋了一遍才下定决心做模块化重构。2. 测试用例模块化的三个层次2.1 先分清三个容易被搞混的概念模块化经常被和“拆分文件”“封装函数”混为一谈。我见过有人把一个测试类的所有函数拆到 50 个文件里美其名曰“模块化”结果每个文件只有几行代码互相引用全靠 import维护起来比原来更痛苦。真正的模块化在我看来是三层结构用例层、操作层、数据层。用例层只负责描述“我要验证什么”。它不关心怎么调接口、怎么拼参数、怎么连接数据库只关注业务场景和预期结果。比如“用户登录成功后可以查看自己的订单列表”这一条用例描述就应该在用例层。操作层负责“怎么做”。它封装了具体的技术细节接口怎么请求、页面元素怎么定位、数据库怎么连接、鉴权怎么处理。操作层提供的是可复用的动作比如login(user)、create_order(payload)、get_order(order_id)。这些动作可以被多个用例调用。数据层负责“用什么样的前提”。测试账号、测试环境地址、测试数据、入参模板、预期值都应该独立出来。这样即使数据变了用例逻辑也不需要动或者业务逻辑变了数据也可以保持不变。2.2 模块化不等于拆很多文件很多同学一听到“模块化”下意识就是建很多目录和文件。但模块化的核心是“职责边界清晰”不是“碎片数量越多越好”。比较理想的做法是按测试对象或者业务域来划分模块。接口测试可以按系统模块分比如用户模块、订单模块、支付模块UI 测试可以按页面或业务流来分比如登录页、商品页、结算页。每个模块内部再按“用例层 操作层 数据层”的方式来组织代码。举个例子订单相关的接口测试可以这样分test_order.py用例层只包含订单相关的测试用例order_api.py操作层封装下单、取消、修改地址等接口操作order_data.py数据层存放下单需要的入参模板、测试账号、预期状态码等如果后续支付模块要复用“下单”这个动作直接从操作层调用order_api.create_order()而不是在支付用例里重新拼一遍订单数据。这就是模块化和文件碎片化的区别模块化关注复用和边界文件碎片化只关注“看起来不挤”。2.3 拆模块时的职责边界每个模块都要有明确的“自己做主”的范围。数据层的变量不应该被用例层直接修改。用例层如果需要特定数据应当通过操作层提供的“预设数据”方法来构造。比如用例需要“已登录用户”的数据前提不应该在用例里直接改全局登录态而是应该调用auth.as_user(tester)由操作层的封装去负责设置和清理。操作层不能包含断言。操作层只负责执行动作和返回结果断言应该由用例层来做。这一点在多人协作时尤其重要否则不同人对同样的操作会有不同的断言习惯操作层就会变成一团乱麻。用例层之间不应互相调用。用例层的函数应当彼此独立单个用例可以被单独执行不依赖其他用例的执行顺序。只有当前置条件确实需要通过前置动作构造时才可以用数据层预置或操作层调用而不是直接写在用例的前后顺序里。3. 实操从混乱到模块化的完整步骤3.1 第一步给现有用例做一次“体检”重构测试代码之前先别急着动手拆。先摸底把现状搞清楚。我一般会统计这么几项测试文件总行数、每个用例函数是否引用了别的用例的私有变量、有多少硬编码、重复代码出现的次数、公共逻辑散落的数量。先看最痛的那一类哪些地方是这次业务一改你要花费最多时间修改的实际操作中我会把用例目录里所有文件列出来然后用代码工具跑一遍重复行检测。重复的代码片段会被标红硬编码的数据也会被列出来。这个过程不要求自动化只要能让你明确以下几点第一哪些代码是所有用例都在用的第二哪些数据被多个用例共享第三哪些用例因为顺序问题必须绑在一起执行。我当时遇到的情况是所有用例的头部都有 30 多行登录和鉴权代码重复率接近 60%。这个数据让我有充分的理由和团队说必须重构。3.2 第二步识别公共层建依赖关系体检结论出来后就可以开始抽取公共层了。先找最底层的公共操作。比如“发送 HTTP 请求”“读取配置文件”“获得数据库连接”这些属于基础设施放在base模块里。很多测试框架本身提供了类似能力但你仍然需要根据自己的业务做一层很薄的封装目的是让后续操作层的调用代码保持简洁。再找业务公共操作。比如“登录”“创建订单”“获取用户信息”这些属于业务操作层。业务操作层依赖基础设施层但不依赖具体用例。也就是说操作层的函数不应该知道“哪个用例在调用我”它只需要知道入参和出参。最后才是用例层。用例层依赖操作层和数据层但不依赖其他用例层。依赖关系是单向的用例层 → 操作层 → 基础设施层。这个依赖关系画成图很简单但在代码里保持不好就会退化成互相 import、循环调用。为了避免这一点我建议在重构时遵循一个简单原则上层可以依赖下层下层不能感知上层。3.3 第三步按“用例 - 操作 - 数据”三层重构用例结构当公共层梳理得差不多后就可以动手重构具体用例了。我以一个典型的“注册用户并下单”场景为例。重构前一个用例函数可能长这样def test_create_order(): # 登录 token login(test_user, 123456) headers {Authorization: token} # 构造订单数据 payload { user_id: 10086, product_id: 888, quantity: 2, address: 测试地址, } # 请求接口 resp requests.post(http://10.0.0.1/order/create, jsonpayload, headersheaders) # 断言 assert resp.status_code 200 assert resp.json()[order_id] 10007这段代码最大的问题是所有细节都摊在一个函数里。一旦登录接口要加一个验证参数你要改这么多用例一旦订单号生成规则变了你要找多个断言里的硬编码。重构以后同一个用例会变成这样def test_create_order(): user data_factory.get_user(default) token auth_api.login(user) order_info order_api.create_order(user, data_factory.order_payload(default)) assert order_info.status_code 200 assert order_info.order_id is not None看起来改动不大但区别在于登录的动作封装在auth_api.login()里如果登录逻辑变了只改auth_api一处订单数据模板在数据层如果入参变了只改数据模板断言里的具体订单 ID 也换成了“不为空”的更稳健断言如果用例要断到数据库也应该由数据层提供查询接口而不是在用例里直接 SQL。3.4 第四步把数据与脚本分离数据与脚本分离是我觉得最容易被忽略、又长期最受益的一步。数据可以放在 yaml、json、ini 或者专门的 Python 数据类里具体用什么格式取决于你们的测试框架和团队习惯。关键是测试代码里不应该出现业务数据字面量。比如# 不要这样 assert resp.json()[code] 200 assert resp.json()[balance] 500.00 assert resp.json()[status] paid这些 200、500.00、paid 都是业务数据。业务数据一变用例就要改。更合理的做法是把这些数据定义为数据模板# 数据层定义 ORDER_EXPECTED { code: 200, balance: 500.00, status: paid, }用例层只需要引用ORDER_EXPECTED。如果需求方调整了余额规则只需要改数据层用例层的逻辑不被动。要注意的是这里说的预期数据分离不等于把断言全部变成“和预期模板全等”否则断言会失去意义。合理的做法是只校验关键字段数据模板也只维护关键字段的期望值。3.5 第五步设计公共接口与参数传递模块化架构搭起来之后接口设计决定模块能否保持稳定。接口设计的核心原则是参数要少、意图要明确、默认值要合理。比如login(user)而不是login(username, password, env)。因为用户名和密码可以从 user 对象中取环境信息可以通过配置读取。参数越多调用方的理解和维护成本就越高。我还建议给公共操作加上明确的返回对象不要只返回原始响应。比如order_api.create_order()返回一个包含order_id、status、balance的对象而不是让每个用例自己去解析 JSON。这样即使接口返回结构变化也只影响操作层的解析逻辑用例层的断言代码可以保持不变。公共接口同时要有稳定的错误约定。如果操作失败是抛异常还是返回错误码团队内部要统一。我个人的习惯是预期内的失败返回错误信息对象预期外的异常直接抛出。这样用例层可以针对不同场景做清晰的处理而不会因为每个用例都在 try-except 里捕获所有异常导致真实错误被掩盖。4. 模块化过程中的常见问题与排查技巧实录4.1 过度抽象看都看不懂模块化做过头最常见的问题是为了消除重复把每个公共方法都包了三四层调用链长到无从阅读。某一次我接手一个用例想查“某个参数到底从哪里来”结果从用例层点到配置层再到数据工厂再到模板继承来回翻了五个文件才找到硬编码。抽象的价值是复用但复用的前提是“可理解性”。如果你的公共方法连你自己下次都要想半天那这个抽象就是负资产。我的排查技巧很简单当一个公共方法超过 30 行或者参数超过 4 个就停下来自我检查是不是应该拆成多个更小的方法或者换成更清晰的数据传递方式。如果调用点本身不复杂就别为了“统一处理”强行抽取。公共代码的抽取应该是代码重复到一定频率后才做不是“可能以后会用到”就做。4.2 参数太多调用混乱模块化过程中最容易踩的第二个坑是公共函数参数随着需求迭代越来越多。今天加一个 flag明天加一个 scope后天再加一个 source。看起来每个参数都有用途但调用方越来越难搞清楚“该传什么”。遇到这种情况我建议把多个关联参数封装成一个对象。比如filter_conditions、query_options这样的数据类而不是散落的六七个布尔值。这样调用方的职责只是构造对象而不是记住每个参数的位置和含义。另外一个实用做法是给所有参数提供安全的默认值。只有用例确实需要覆盖默认行为时才显式传参。默认值应当代表最常用的场景而不是“空值”。比如create_order(user)默认创建一个标准订单用例只需要在特殊订单场景时才传额外参数。4.3 模块之间形成循环依赖模块化重构到一半最容易出现的情况是操作层想调用数据层数据层又想调用操作层或者用例层捡便宜直接 import 了另一个用例层的函数。循环依赖在 Python 这类语言里通常不会直接报错但你的包的初始化顺序一旦变化就会出现“无法 import 某个模块”的怪问题。更麻烦的是循环依赖会让单元测试变得非常脆弱因为任何一个模块都不能独立测试。我的排查方法是任何一个模块的 import 都不允许出现“同层”的交叉引用。比如两个操作模块之间不应该互相调用如果确实需要就把它下沉到更底层的基础设施模块。一旦发现某个测试文件 import 了其他测试文件就要警惕这通常意味着你把公共操作放错位置了。4.4 团队协作中的“唯一入口”问题模块化之后如果团队没有约定“公共操作只能通过某个入口调用”很快就会出现多个入口、多种风格并存的局面。今天有人直接调用操作层明天有人绕过操作层、直接请求接口后天的用例又重新在本地拼了一遍请求。我在一次重构后的项目里尝试过这样的约定测试用例只允许 import 用例层目录下的公共入口模块不允许直接 import 操作层。操作层的类和方法只允许通过入口暴露的函数来调用。这个约束在多人协作时尤其有效可以让团队对新代码风格保持统一也方便后续做统计和管理。另外需要注意的是模块化之后要配一份简短的“测试代码编写规范”内容不用多五条以内就够数据不能硬编码、公共操作走入口调用、用例之间不互相依赖、断言不用操作层、新用例必须标注前能单独执行。这份规范比我预期的更管用因为重构后最怕的就是旧习惯慢慢回流。下面整理一个常见问题速查表适合在重构过程中对照排查现象可能原因处理思路改一个字段十个用例报错硬编码散落、数据未分离全局搜索硬编码将数据下沉到数据层单独执行某个用例失败顺带跑整个文件能过用例之间存在执行顺序依赖拆分用例之间共享状态通过前置操作或数据预置替代一个公共方法被改坏所有用例炸操作层方法职责不清或缺少单测给公共操作补上基础测试尽量保证操作层独立可验证新用例不知道该从哪里取数数据层职责不清晰、命名不统一建立数据模板清单按业务域分组命名抽象层数太多用例难以阅读过度设计、过度抽象简化公共方法回归到“一眼能看懂”的标准5. 模块化之后如何防止用例再次腐化5.1 建立用例代码评审习惯测试用例重构完成不意味着可以一劳永逸。我见过不少项目重构的时候信誓旦旦三个月后又回到原来的混乱状态原因是新用例进来时没有人把守。最有效的把守手段是评审。并不是说每次提交都要走很重流程的评审而是至少做到提交测试代码时有另一个同事看一眼。评审时重点看有没有新增硬编码、是不是直接从操作层拿数、用例之间是否产生了依赖、断言是否合理以及新用例是否基于公共入口来写。如果这些都能过用例腐化的速度就能大为降低。我自己在项目里带过一个习惯任何新用例提交先自查再让一个不熟悉这个模块的同事看。同事看不懂的说明用例还不够清晰。这个判断标准非常朴素但好用。5.2 一些降低长期维护成本的小技巧最后分享几个我在实操中一直坚持的小技巧。第一断言要写“业务含义”不要只写状态码。比如“订单创建成功”比“HTTP 200”更有意义。状态码会随着设计变化而“订单创建成功”背后的业务语义不会那么频繁变化。第二数据模板加注释。尤其是那种“为什么这个值要等于这个数”的情况一定要写。否则三个月后你自己都会怀疑这个数字是不是写错了。第三每次业务变更先改数据层再改用例层。如果发现某个业务变更需要改到几十个用例那就说明你的用例层没有把变化隔离住应当回到模块化的设计上来调整而不是硬着头皮改完。第四周期性检查重复率。可以用工具扫描代码重复度。如果重复率超标就主动排查是不是又有复制粘贴的坏味道。这比等用例报错了再临时补救要轻松得多。这些经验是我踩了很多次坑才总结出来的。回到开头的问题测试用例难维护真的不是因为你不够细心而是因为你把用例当成了“一次性脚本”没有给它一个清明的结构。模块化的本质不是技巧层面的拆文件、抽函数而是把测试代码当作一个可持续演进的工程来设计。每一次重构都不必追求完美但至少要保证下一次业务变更时你不必在几十个文件里“捡弹壳”。如果你所在的项目现在也处在“用例越改越乱”的阶段我建议从今天开始先做一次体检找到重复率最高、变化最频繁的那几处先把那个局部的模块化做好。一次只做一个模块你会发现后面的维护会比以前轻松很多。

相关新闻

React零基础到进阶:从JSX、Hooks到任务看板实战指南

React零基础到进阶:从JSX、Hooks到任务看板实战指南

1. 学习路线设计:零基础到进阶的三种不同走法1.1 为什么我建议按“三层金字塔”来学ReactJS这几年在前端圈的地位,不用我多说了。打开任意一个招聘页面,十个前端岗位里八个写着“熟悉React”。但对零基础的人来说,React的学习路径…

2026/10/10 4:40:18 阅读更多 →
npm -v 报错不用慌:Windows10环境变量与PowerShell排查全攻略

npm -v 报错不用慌:Windows10环境变量与PowerShell排查全攻略

你有过这种经历吗:从官网下载Node.js,一路Next装完,正准备在PowerShell里验证环境,结果敲下npm -v,屏幕直接弹出一行红字——“npm : 无法将‘npm’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。定位到Windo…

2026/10/10 4:40:18 阅读更多 →
2026 IDE简记:多语言混编、远程开发与AI辅助编程实践

2026 IDE简记:多语言混编、远程开发与AI辅助编程实践

眼下这批项目的技术栈是越来越杂了,Java服务、Python脚本、前端页面、Go工具链全混在一个仓库里,我花了不少时间折腾IDE的选型、配置、插件、还有AI辅助编程的工作流。写这篇“IDE简记:2026更新”,主要是把这一年多反复试错之后留…

2026/10/10 4:40:18 阅读更多 →

最新新闻

Spring AI 实战:从配置到对话,ChatClient 链式调用与上下文管理

Spring AI 实战:从配置到对话,ChatClient 链式调用与上下文管理

1. 从配置文件到对话窗口:Spring AI 到底简化了什么第一次接触 Spring AI 的时候,我脑子里其实带着一个很具体的疑问:过去在 Java 项目里接一个大模型对话能力,光是 HTTP 客户端封装、请求体拼装、响应解析、异常重试这些杂活&…

2026/10/10 5:17:30 阅读更多 →
如何安全管理 OpenFlux 共享密钥:传输、存储与轮换实战指南

如何安全管理 OpenFlux 共享密钥:传输、存储与轮换实战指南

如何安全管理 OpenFlux 共享密钥:传输、存储与轮换实战指南 OpenFlux 是一款网络栈研究工具,通过可插拔的传输层构建 TCP 隧道。当启用传输加密时,客户端与出口节点共用的**共享密钥(shared secret)**就是整条隧道的安…

2026/10/10 5:17:30 阅读更多 →
Ant Design Blazor Affix 滚动容器实战:用 TargetSelector 将固钉绑定到指定滚动元素

Ant Design Blazor Affix 滚动容器实战:用 TargetSelector 将固钉绑定到指定滚动元素

前端UI组件设计系统 【免费下载链接】ant-design-blazor 基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。 项目地址: https://gitcode.com/ant-design-blazor/ant-design-blazor 点击查看 免费下载 本篇指南围绕 Ant Desig…

2026/10/10 5:17:30 阅读更多 →
x64dbg 调试器插件开发指南:深入解析 DbgScriptBpToggle 脚本断点切换 API 及其完整调用链

x64dbg 调试器插件开发指南:深入解析 DbgScriptBpToggle 脚本断点切换 API 及其完整调用链

逆向工程调试器开发工具应用安全 【免费下载链接】x64dbg An open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis. 项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg 点击查看 免费下载 导读 DbgScriptBpT…

2026/10/10 5:17:30 阅读更多 →
LogicStack-LeetCode 题解:813. 最大平均值和的分组——「序列 DP + 前缀和」求连续段平均值之和最大值

LogicStack-LeetCode 题解:813. 最大平均值和的分组——「序列 DP + 前缀和」求连续段平均值之和最大值

教程文档 【免费下载链接】LogicStack-LeetCode 公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码 项目地址: https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode 点击查看 免费下载 导读 本篇以「宫水三叶的刷题日记」系列仓库(LogicSta…

2026/10/10 5:17:30 阅读更多 →
GPS天线设计 GNSS天线设计建议

GPS天线设计 GNSS天线设计建议

GPS天线设计 GNSS天线设计建议 天线作为导航定位设备中最重要的接收器件,它起到的作用就像是人的“耳朵”;是将卫星发送下来的电磁波能量变换成电子器件可解析的电流。因此天线的性能好坏将直接关系到GPS整机的产品性能。目前GNSS系统开放民用定位系统主要是美国GPS…

2026/10/10 5:16:30 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →