惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

祝融说。

共识并不平均,但是基本上均衡。 权力是共识切片的曲率。 存在不是「是什么」,而是一系列极小的,从分歧到共识再到分歧的,连续的构建过程。 分歧实际上是对共识往哪个方向延伸的拉力。 分歧是尚未落实的实在,是可能性基底中尚未被锁定的在共识中相互牵引的可用余量。 权力从来不是中立的,它是带有倾向性的「牵扯力」。 过程即完备,容错即自由。 第10章 逆向投喂:用真实数据让AI做出精准诊断 第12章 定期“垃圾回收”:别让系统背负AI制造的债务 第13章 防退化契约:确保每一次修改都是在进步 第14章 全生命周期演练:从零开始用“有效约束”交付一个项目 第15章 随身工具包:即查即用的约束指令库 第1章 这不是结对编程,这是“人机共生” 第2章 你必须警惕的三个陷阱 第3章 把话说死:用 Markdown 建立 AI 的“单源真相” 第4章 负空间设计:先规定“不准做什么”,再让它写代码 第5章 模块化解耦:让AI每次只面对一个小问题 第6章 上下文断头台:善用 `/clear` 斩断错误蔓延 第7章 剥夺执行权:强制 AI 像资深工程师一样“慢思考” 第8章 角色锁定:用一句话给AI戴上“思考帽” 第9章 遥测驱动:帮AI长出“千里眼”和“顺风耳” 结语:成为系统牧马人,而不是代码搬运工 第八章 金融与科技的“禁手”:现代战争的底层收敛 第二章 认知锚点:心理战中的“强制步” 第九章 历史的单行道:那些被剥夺国运的时刻 第六章 消费主义的迷宫:在货架上剥夺选择 第七章 战略逼压:没有硝烟的“切香肠战术” 第三章 构造绝杀:逻辑闭环的艺术 第十二章 绝对零度下的生机:成为“不可测”的人 第十一章 掀翻棋盘:非对称竞争与正交化打击 第十章 识破隐形控制:第一时间嗅到危险 第四章 标准的暴政:打造“不得不”的生态 第五章 锁死阀门:关系链与供应链的囚笼 第一章 降熵法则:时空维度的隐蔽控制 结语:愿你在这个被设定的世界里,永远握有掀桌的权力。 引言:自由意志的幻觉 项羽 当前的AI工程化本质上是受限于上下文长度而采用的「以提示词约束去置换确定性」的一种妥协。 即时反应是一种不假思索,它是观念通过最简单、轻易、高效的路径寻求表达。 青衫 第九章:估值的坐标:建立“内在记分牌” 第六章:资产重估的艺术:从“硬实在”到“认知折价” 第七章:预期差交易:坍缩“概率波” 第十一章:内在博弈:克服‘评估异化’ 第十章:交易的算法:逆人性的“人之道” 第五章:空间套利:高能耗产业的跨境建构 结语:构建你的“财富多重宇宙” Code-Coder 第八章:效率革命:细分赛道的“降本增效” 第二章:评估权的博弈:商业模式的权力差序 第三章:去伪存真:穿透“符号泡沫” 第四章:能源共识:黑金的物理法则 第一章:宏观观察者:借势“国家共识” 前言:从“市场囚徒”到“清醒的观察者” Code-Ledge-X Code-Lint-X
第11章 测试电网:用刚性指标代替肉眼审查
祝融 · 2026-05-16 · via 祝融说。

在所有的自动化质量保障手段中,自动化测试,无疑是基石中的基石。在AI编程时代,它的重要性,被提升到了前所未有的、关乎生死存亡的战略高度。

过去,我们为代码编写测试,主要是为了“防止自己犯错”和“方便未来的重构”。现在,我们编写测试的首要目的,变成了“为AI的行为,划定一条绝对的、可被机器验证的行为基线”。

每一条单元测试,都是对AI的一个“微型约束”。它用代码的语言,精确地定义了:“对于这个输入,你必须返回这个输出。”、“当你执行这个操作后,系统的状态必须发生这样的变化。”、“如果你收到了这个异常输入,你必须抛出这个特定的错误。”

当成百上千个这样的“微型约束”汇集在一起时,它们就构成了一张强大的“电网”。AI可以在这张电网所包裹的安全区域内,自由地、大刀阔斧地进行重构和优化。但只要它的任何一次修改,哪怕只是一个字符的变动,导致了某个预期的行为发生了偏差,这张电网就会立刻“通电”,通过一个失败的测试用例,发出刺耳的警报。

本章,我们将学习如何不再将测试视为一项“编码完成后”的附属工作,而是将其视为在AI介入之前,就必须铺设好的、保护核心领域逻辑的“安全网”。

11.1 AI 重构代码时,你如何不被破坏已有功能?

AI最令人惊艳、也最令人恐惧的能力之一,就是它的大规模代码重构能力。

你可以把一个长达500行的、混乱的“巨无霸”函数扔给它,然后说:“请将这个函数,重构成符合SOLID原则的、更小、更内聚的多个函数和类。” 几秒钟后,它就能为你呈现出一份看起来组织良好、结构清晰的全新代码。

这看起来像魔法,但也可能是“黑魔法”。你怎么能确定,这个被“整容”得面目全非的新代码,其外部行为,和旧代码是100%等价的?你怎么知道,在那些眼花缭乱的“提取方法”、“移动字段”的操作中,某个微小但关键的业务逻辑,没有被AI“优化”掉?

答案是:如果没有自动化测试,你无法知道。你只能祈祷。

“肉眼审查”在这种场景下,几乎是完全无效的。因为人类的大脑,极其不擅长在两个复杂但逻辑相似的代码结构之间,进行“行为等价性”的精细比对。我们会很容易被新代码整洁的“表象”所迷惑,而忽略其内在的、细微的逻辑变化。

“黄金覆盖率”测试套件:AI重构的许可证

这就是自动化测试,尤其是单元测试,在AI时代扮演的全新角色:它成为了我们授权AI进行大规模重构的“许可证”。

在我们向AI发出任何一个“重构”或“优化”的指令之前,我们必须先完成一个前置动作:为即将被重构的目标代码,编写一套高覆盖率的单元测试套件。

这套测试,就像是在重构前,为旧代码拍摄的一张“行为快照”。它将旧代码所有已知的、重要的行为特征,用代码的形式,精确地固定了下来。

【一个具体的重构流程】

场景:我们有一个陈旧的、负责计算订单折扣的函数calculateDiscount。它里面充满了if-else嵌套,难以维护。我们想让AI来重构它。

错误的流程(祈祷式重构):

  1. calculateDiscount函数的代码复制给AI。
  2. 说:“请重构这个函数,让它更清晰。”
  3. AI返回了一个使用“策略模式”的、非常优雅的新版本。
  4. 你“肉眼”看了一遍,觉得很棒,就替换了旧代码。
  5. 一周后,财务部门报告,所有“钻石会员”在“周年庆”期间购买“数码产品”的订单,折扣都算错了。你陷入了无尽的加班地狱。

正确的流程(电网式重构):

  1. 第一步:铺设电网。在动手重构之前,先为现有的、丑陋的calculateDiscount函数,编写全面的单元测试。
// calculateDiscount.test.js
test('普通会员购买普通商品,应无折扣', () => { ... });
test('黄金会员应有95折', () => { ... });
test('钻石会员应有90折', () => { ... });
test('周年庆期间,所有商品额外9折', () => { ... });
test('数码产品不参与周年庆额外折扣', () => { ... });
test('钻石会员在周年庆购买非数码产品,应享受折上折', () => { ... });
// ... 覆盖所有已知的业务规则和边界条件
你运行这套测试,确保它们全部通过。此时,你就拥有了一张保护现有功能的“安全网”。
  1. 第二步:授权AI重构。现在,你可以放心地把calculateDiscount函数的代码交给AI了。

    “这是我们的折扣计算函数和它的单元测试套件。目前所有测试都能通过。请在不改变任何测试文件的前提下,重构calculateDiscount函数,使其内部实现更清晰、更易于扩展。重构后的代码,必须依然能让所有现有测试通过。”

  2. 第三步:AI在“电网”内工作。AI接收了指令,开始进行它的“魔法”。它可能会将原来的if-else,重构成一个优雅的“规则引擎”或“策略模式”。

  3. 第四步:自动化验收。AI返回了它重构后的新代码。此时,你不需要用肉眼去逐行审查它的复杂逻辑。你要做的唯一一件事,就是用它返回的新代码,替换掉旧的实现,然后——重新运行那套单元测试。

  4. 第五步:审判时刻。

    • 如果所有测试依然通过:恭喜你!AI的重构是行为等价的。你可以极大概率地相信,这次重构是安全的。你可以充满信心地合并这次修改。
    • 如果某个测试失败了:比如,钻石会员在周年庆购买非数码产品...这个测试挂了。这张“电网”立刻发出了警报!它精确地告诉你,AI在重构过程中,遗漏或误解了“数码产品不参与周年庆折扣”这个复杂的业务规则。

此时,你就捕获了一次潜在的、灾难性的生产环境Bug。你不需要去猜测问题出在哪里,失败的测试用例,已经像一个精准的探针,指明了缺陷的所在。你可以把失败的测试结果和AI的新代码,一起“逆向投喂”给AI,让它自己去修复它引入的问题。

结论 在AI时代,测试的价值,发生了根本性的跃迁。它不再仅仅是“质量保证”的工具,更成为了人机协作中,定义行为契约、约束AI行为、自动化验收AI产出的核心机制。

先写测试,再让AI重构。 这条铁律,是你驾驭AI强大重构能力,而又不被其反噬的“护身符”。

11.2 把单元测试变成不可逾越的电网(覆盖率硬标准)

我们已经知道了测试的重要性。但一个随意的、覆盖不全的测试套件,其“电网”是充满漏洞的,AI可以轻易地从漏洞中“钻过去”,破坏那些未被测试覆盖到的功能。

为了让这张“电网”真正有效,我们必须引入刚性的、可量化的指标,来衡量其“密度”和“强度”。其中,最基础、也最有效的指标,就是“代码覆盖率”。

代码覆盖率,衡量的是你的测试用例,执行到了被测代码的多少比例。常见的覆盖率指标包括:

  • 行覆盖率: 测试代码执行了多少行的业务代码?
  • 分支覆盖率: 测试代码覆盖了多少if-elseswitch的分支(truefalse分支是否都走到过)?
  • 函数覆盖率: 测试代码调用了多少个函数?

在这些指标中,分支覆盖率,是最有价值的指标,因为它直接关系到代码中的“决策逻辑”是否被充分测试。

设定“不可协商”的覆盖率门禁

光有覆盖率报告还不够。我们必须将它,变成一个自动化的、不可逾越的“门禁”。这意味着,我们需要在我们的持续集成(CI)流水线中,设置一个“质量门禁”。

这个门禁的规则非常简单、冷酷无情:

任何一次代码提交,如果导致项目的整体代码覆盖率,或者某个核心模块的代码覆盖率,低于预设的阈值(比如,85%),那么这次构建将自动失败,该提交将被严禁合入主分支。

这个规则,对人类和AI,一视同仁。

为什么这个“硬标准”如此重要?

  1. 杜绝借口:它将“要不要写测试”、“测试要写到什么程度”这类主观的、容易产生争论的问题,变成了一个客观的、非黑即白的工程标准。低于85%,就是不行,没有任何借口。
  2. 量化驱动:它为我们和AI,提供了一个清晰的、可量化的工作目标。我们的任务,不再是模糊的“写一些测试”,而是明确的“将覆盖率提升到85%以上”。
  3. 赋予AI“自检”能力:当AI完成一次代码修改后,我们可以授权它自己去运行测试和覆盖率检查。如果覆盖率不达标,它就会立刻知道自己的工作“不合格”,并需要继续补充测试用例。这极大地减轻了我们人工审查测试完整性的负担。

如何与AI协作,达到覆盖率目标?

设定了门禁,下一个问题就是如何达到它。AI本身,就是一位不知疲倦的、极其优秀的“测试用例编写员”。

【让AI编写测试的指令模板】

你的提问:

Context: We have a hard requirement that all new code must have at least 85% branch coverage. I have written the following function, but I haven't written any tests for it yet.

Your Role: Act as a meticulous QA Auditor with expertise in Test-Driven Development (TDD).

Code to be Tested:

Task:

  1. Analyze the Code: Identify all logical paths, branches, and edge cases in the provided function.
  2. Generate Test Cases: Write a comprehensive suite of unit tests using the [你的测试框架,比如:Jest] framework.
  3. Ensure Full Coverage: The test suite you write must aim for 100% branch coverage for the given function. For each if statement, you must provide at least one test case for the true path and one for the false path. For each error condition, you must write a test to assert that the correct error is thrown.
  4. Explain Your Tests: Briefly comment on why each test case is necessary.

AI在执行这个指令时,会系统性地分析你的代码,找出所有ifelseforwhiletry-catch,然后像一个强迫症患者一样,为每一个逻辑分支,都精心设计一个对应的测试用例。它尤其擅长处理那些我们容易忽略的“边界条件”,比如空数组、null输入、除以零等。

通过将“覆盖率”这个刚性指标,与AI强大的“测试用例生成”能力相结合,我们就建立了一个良性循环:

  1. CI门禁,设定了不可降低的质量底线。
  2. AI,成为了我们达到这个底线的最高效的工具。

这张“测试电网”,从此变得致密、坚固,并且具备了“自我修复和增强”的能力。

11.3 致命指令:“执行并修复所有失败的测试”

我们已经铺设了电网(编写测试),并设定了门禁(覆盖率标准)。现在,我们来学习如何最有效地利用这张电网,来“约束”和“驱动”AI的日常开发工作。

一个革命性的、但需要谨慎使用的指令,就是授权AI去“执行并修复”失败的测试。

这个指令的强大之处在于,它将原来需要我们“人肉”介入的“调试循环”,变成了一个AI的“自洽循环”。

传统的调试循环(人类驱动):

  1. AI生成代码。
  2. 人类运行测试。
  3. 测试失败。
  4. 人类阅读失败日志。
  5. 人类分析失败原因。
  6. 人类告诉AI哪里错了,以及该如何修复。
  7. 回到第1步。

这个循环,效率的瓶颈,完全在于人类的分析和转述能力。

AI的自洽循环(测试驱动):

  1. AI接收一个任务(比如,“增加一个新功能”)。
  2. AI修改代码。
  3. AI自己运行测试。
  4. 测试失败。
  5. AI自己阅读失败的测试日志(错误信息、失败的断言、堆栈跟踪)。
  6. AI自己分析失败的日志与它刚刚修改的代码之间的因果关系。
  7. AI自己提出一个修复方案,并生成新的代码。
  8. 回到第3步,直到所有测试都通过为止。

看到了吗?在这个新循环里,失败的测试日志,成为了AI的“老师”和“指挥官”。它不再需要我们去“翻译”问题,而是可以直接从最原始、最客观的“机器反馈”中,进行自我学习和修正。

如何下达这个“致命指令”?

这个指令,通常用于对一个已有稳定测试套件的系统,进行功能扩展或Bug修复。

【指令模板 11.1:测试驱动的Bug修复】

你的提问:

Context: We have a bug in our system. I have already written a new unit test that reproduces this bug. This new test is currently the only failing test in our test suite.

Your Role: Act as a Senior Software Engineer practicing Test-Driven Development (TDD). Your goal is to make the failing test pass, without breaking any other existing tests.

Failing Test Code:

// [粘贴那个能够复现Bug的、正在失败的测试用例]

Relevant Business Logic Code:

// [粘贴与Bug相关的、需要被修改的业务代码]

Your Task (Iterative Process):

  1. Analyze the Failure: Read the failing test and understand the discrepancy between the expected behavior and the actual behavior of the business logic code.
  2. Propose a Fix: Suggest a minimal change to the business logic code that you believe will fix the issue.
  3. Apply and Verify: I will apply your proposed fix and re-run the entire test suite. I will then give you the new test results (either "All tests passed" or a new list of failing tests).
  4. Repeat: If tests are still failing, analyze the new results and propose another fix. Continue this loop until I tell you "All tests passed".

【指令模板 11.2:测试驱动的功能开发】

你的提问:

Context: I want to add a new feature: "[简要描述新功能,比如:支持'买一赠一'的折扣类型]". I have already written the "scaffolding" for this feature, including a set of new, currently failing ("pending") unit tests that define how this new feature should behave.

Your Role: Act as a Senior Software Engineer practicing TDD. Your task is to write the necessary business logic to make all the new pending tests pass.

New, Failing ("Pending") Tests:

// [粘贴为新功能编写的、描述了其规格的、正在失败的测试用例]

File to Modify: [提供需要添加新逻辑的文件路径和现有代码]

Your Task: Your mission is to write the implementation code inside [文件名] that satisfies all the requirements defined by the new tests. You must do this without breaking any of the existing tests in the suite. I will run the tests after each of your suggestions and provide you with the results.

使用的前提与风险

这个“授权AI自我修复”的模式,威力巨大,但也有其适用边界和风险:

  • 前提:高质量的测试。这个模式的成败,完全取决于你的测试套件的质量。如果你的测试本身就有逻辑错误,或者覆盖不全,AI可能会为了“让测试通过”,而写出一些满足了错误测试、但本身逻辑依然有问题的代码。垃圾测试进,垃圾代码出。
  • 风险:可能陷入“局部最优”。AI可能会找到一个“投机取巧”的、最小化的代码改动,来让当前的失败测试通过,但这个改动可能不是一个优雅的、通用的解决方案。
  • 你的角色:在这个循环中,你的角色,从一个“微观管理者”,转变为一个“最终验收官”。你不需要再告诉AI“怎么做”,但你需要在AI报告“所有测试已通过”时,对它最终给出的“工作成果”(通过了所有测试的代码),进行一次更高维度的、从架构和设计原则角度的最终审查。确保它没有为了通过测试,而破坏代码的整体优雅性。

尽管有这些风险,但“测试驱动AI”的模式,依然是目前我们所拥有的、最接近于“自动化软件开发”的强大范式。它将AI的“黑盒”代码生成过程,置于一个完全“白盒”的、可被精确验证的约束框架之下,实现了速度与质量的完美结合。

【配置模板】AI编程项目的测试栅栏搭建

为了让你能立刻动手,为你的项目搭建起这套“测试电网”,这里提供一个基于常见JavaScript/TypeScript项目的配置模板和工作流。

技术栈示例:

  • 测试框架: Jest
  • 覆盖率工具: Jest's built-in coverage (using Istanbul)
  • CI/CD: GitHub Actions

第一步:配置 jest.config.js

在你的Jest配置文件中,开启覆盖率收集,并设置“门禁”。

// jest.config.js
module.exports = {
// ... 其他配置 ...

// 开启覆盖率报告生成
collectCoverage: true,

// 指定从哪些文件收集覆盖率信息
collectCoverageFrom: [
 'src//*.{js,jsx,ts,tsx}',
 '!src//*.d.ts',
 '!src/index.ts', // 排除入口文件等
],

// 指定覆盖率报告的输出目录
coverageDirectory: 'coverage',

// 【核心】设置覆盖率质量门禁
coverageThreshold: {
 global: {
 branches: 85, // 全局分支覆盖率必须达到85%
 functions: 85, // 全局函数覆盖率必须达到85%
 lines: 85, // 全局行覆盖率必须达到85%
 statements: 85, // 全局语句覆盖率必须达到85%
 },
 // 你还可以为特定的、更核心的模块,设置更高的要求
 './src/core/business-logic/': {
 branches: 95,
 statements: 95,
 },
},
};

第二步:配置 package.json 脚本

添加一个专门用于运行测试并检查覆盖率的脚本。

// package.json
{
"scripts": {
 "test": "jest",
 "test:coverage": "jest --coverage"
}
}

现在,当你在本地运行npm run test:coverage时,如果覆盖率不达标,Jest会直接报错并以非零状态码退出。

第三步:在GitHub Actions中建立自动化防线

在你的项目根目录创建.github/workflows/ci.yml文件。

# .github/workflows/ci.yml
name: CI & Quality Gate

on:
push:
 branches: [ main ]
pull_request:
 branches: [ main ]

jobs:
test:
 runs-on: ubuntu-latest

 steps:
 - name: Checkout code
 uses: actions/checkout@v3

 - name: Setup Node.js
 uses: actions/setup-node@v3
 with:
 node-version: '18'

 - name: Install dependencies
 run: npm install

 - name: Run tests with coverage check
 # 这里的关键是运行我们带有覆盖率检查的脚本
 # 如果jest因为覆盖率不达标而报错退出,整个CI Job就会失败
 run: npm run test:coverage

配置完成!

从现在起,任何推送(Push)到main分支,或向main分支发起的拉取请求(Pull Request),都会自动触发这个工作流。如果新代码的测试没有写够,导致覆盖率低于你在jest.config.js里设定的85%的门禁,GitHub Actions会立刻显示一个红色的“X”。

这个红叉,将成为一个不可逾越的“栅栏”。你的团队(包括你和你的AI),将无法合并任何破坏了质量底线的代码。

你,已经成功地将一项需要靠“自觉”和“纪律”来维持的质量标准,物化成了一个自动的、刚性的、永不妥协的工程现实。这道“测试电网”,将成为你项目资产最忠实的、24小时在线的守护神。