2026年6月9日 你有一半的 Cucumber 场景被跳过了。这就是那个状态在欺骗你的原因。 Cucumber 的 'skipped' 状态隐藏了三种完全不同的问题。以下是如何诊断是哪一种在侵蚀你的测试套件,以及如何阻止它。 deep-divescucumberbddtest-maintenance
2026年6月8日 你的 Gherkin 规格说明正在对你撒谎 一旦你指望人工手动维护,Gherkin 规格说明就会立刻与现实脱节。本文介绍如何通过自动化检查,让 feature 文件始终如实反映系统行为。 deep-divesgherkinbddliving-documentation
2026年6月7日 编译器检查语法,测试应该检查架构。 大多数团队把架构规则写在维基里。这里介绍如何把它们写成可执行的测试,当你的依赖图发生漂移时让 CI 挂掉。 deep-divesarchitecture-testingclean-architectureci-cd
2026年6月6日 你的领域层引用了 Postgres。你的 CI 却视而不见。 整洁架构的图在白板上看着很美。本文介绍如何在构建流水线中强制执行依赖方向,让领域代码永远无法触及基础设施。 deep-divesclean-architectureci-cddependency-rules
2026年6月5日 你的架构图早就是谎言了 架构文档在你保存的那一刻就开始腐烂。以下是如何利用代码生成图表、ADR 和自动化架构测试来保持文档的诚实。 deep-divesarchitecturedocumentationliving-docs
2026年6月4日 你的重试循环假设第一次请求失败了。大概率并没有。 超时或崩溃并不意味着你的 API 请求已经丢失。本文介绍幂等键(idempotency key)如何让重试变得安全,以及真正防止重复请求的数据库存储模式。 deep-divesidempotencyapi-designresilience
2026年6月3日 比进程更长寿的锁:分布式租约的真实工作原理 内存中的互斥锁在服务器重启后随即消失。本文介绍带有 fencing token 和 TTL 的分布式租约如何防止崩溃后的重复执行,以及它们在哪里仍然会失效。 deep-divesdistributed-locksleasingresilience
2026年6月2日 无 goroutine、无定时器、无后台开销的熔断器 大多数熔断器库都会启动后台线程来探测恢复。你根本不需要它们。本文介绍一种请求驱动的设计,在消除所有后台开销的同时,不牺牲正确性。 deep-divescircuit-breakerperformanceresilience
2026年6月1日 你的 Web 服务有一条优雅关闭路径。这就是 Bug。 Crash-only 软件将每一次失败视为崩溃,将每一次启动视为恢复。对于 Web 服务来说,这意味着删除你的关闭逻辑,并设计出能在 kill -9 下存活的状态。 deep-divescrash-only-softwareresiliencedistributed-systems
2026年5月31日 看不懂突变改了什么,怎么写测试杀死它? mutation testing 发现了一个 survivor,但你根本不知道这个 mutation 做了什么。这里有一个分步方法,让你不用先理解 mutant 也能写出正确的测试。 deep-divesmutation-testingtest-writingdebugging
2026年5月30日 认证代码需要 90% 的变异覆盖率。你的字符串工具函数不需要。 为什么在整个代码库强制执行单一变异分数是错误的,以及如何根据实际风险设置按模块划分的阈值。 deep-divesmutation-testingauthtest-quality
2026年5月29日 你的测试全过了。变异得分只有40%。以下是你该从存活变异体中读到的东西。 代码覆盖率告诉你很安全。变异测试告诉你,你的测试大多只是摆设。以下是存活变异体如何暴露这一鸿沟,以及如何弥合它。 deep-divesmutation-testingsurviving-mutantstest-quality
2026年5月28日 Rust 的变异测试确实能用,但你的编译时间会恨你 cargo-mutants 能找出那些只是假装在验证代码的测试。本文介绍变异测试在 Rust 中的工作原理、它能捕捉什么问题,以及编译时间成本是否值得。 deep-divesmutation-testingrustcargo-mutantstest-quality
2026年5月27日 变异测试需要跑4小时。团队到底怎么在CI里用它? 大多数团队不会每次提交都跑完整的变异测试套件。以下是工程团队如何在不破坏构建流水线的情况下,真正把变异测试集成进CI的做法。 deep-divesmutation-testingci-cdtest-quality
2026年5月26日 单元测试全绿,但你的数据照样消失 Mock 数据库测试验证的是 SQL 语法,而不是数据行能否在崩溃、并发写入或 schema 不匹配时存活。下面介绍如何真实地测试持久化。 deep-divesdatabasetestingpersistence
2026年5月25日 不被 mock action 淹没地测试 Redux 为每个 Redux action 写 mock 会让你的测试变成 changelog 校验器。下面介绍如何用真实的状态流转来测试 store。 deep-divesreduxtestingstate-management
2026年5月24日 100 次测试运行是个谎言:如何真正确定你的 Property-Based Tests 规模 Property-based testing 中默认的 100 个 example 是一种社会妥协,而非统计策略。以下是如何选择与你的信心需求和 CI 预算相匹配的运行次数。 deep-divesproperty-based-testingtest-coverageshrinking
2026年5月23日 Rust 中的 property-based tests 能找到单元测试漏掉的 bug 基于示例的测试只覆盖你想得到的输入。property-based testing 生成随机数据,检查 invariants,并将失败 shrink 到最小反例。 deep-divesrustproperty-based-testingquickcheckproptest
2026年5月22日 你的单元测试通过了,但生产代码仍然是坏的 代码覆盖率指标制造了一种虚假的安全感。以下是单元测试为何漏掉那些让你夜不能寐的 bug,以及你应该测什么。 deep-divesunit-testingtest-qualitybug-prevention
2026年5月21日 Rust 的 Runtime Contracts 可以在 Release 构建中零开销,但编译器不会替你实现 Rust 会自动剥离 debug assertions,但真正的 design-by-contract 需要的远不止 debug_assert!。本文介绍如何在 Release 二进制文件中实现零成本的 runtime contracts,并让它们彻底消失。 deep-divesrustruntime-contractsperformance
2026年5月20日 零个、一个还是十二个:生产函数到底需要多少个断言 开发者要么像撒彩纸一样到处抛撒断言,要么完全避之不及。这个决策框架能帮你区分有用的 invariants 和生产环境崩溃的触发器。 deep-divesassertionsproduction-codedefensive-programming
2026年5月19日 你的验证层比业务逻辑还庞大 手动验证会让 codebase 膨胀不堪,却依然遗漏边界情况。下面介绍如何通过声明式 schemas 强制执行 runtime contracts,同时让它们不碍你的事。 deep-divesruntime-contractsvalidationdesign-by-contract
2026年5月18日 TypeScript strictNullChecks 是编译时守卫,而非运行时盾牌 严格模式能捕获你写出来的 null,却无法捕获来自 API、DOM 查询和 JSON.parse 在运行时抵达的 null。类型系统止步之处,正是你的防御开始之时。 deep-divestypescriptnull-safetystrict-mode