该技能用于编写或重构单元测试,包括新建测试文件、补充用例、修复不稳定测试或重构难以阅读的测试。它要求先具备 principal-engineering 技能背景,testing-changes 负责判断一次改动需要哪些测试,本技能关注测试本身的写法。核心原则是测试契约而非实现:通过单元的公开契约进行验证,保留行为的重构不应导致测试失败;除非交互本身就是契约,不应对调用顺序或内部状态做断言。预期值必须独立得出为字面量,不能复用生产代码的公式或共享辅助函数。每个测试只覆盖一个行为,名称需说明对象、场景与预期结果,如 expired_token_is_rejected_with_401,不要使用编号式名称。测试按 arrange、act、assert 顺序清晰书写,测试体内不写分支、循环或逻辑。需保证确定性:注入时钟、固定或注入随机性、mock 边界,不使用真实网络、文件系统、sleep,异步等待应基于条件而非时长。mock 仅针对不归自己所有的边界;mock 过多说明可能测的是 mock 本身,此时应考虑放宽单元或改用集成测试。夹具应是具名的最小现实快照,契约变化时主动更新。断言应检查具体值而非仅无异常,失败路径也是头等测试对象,测试中不得静默捕获异常或条件性跳过断言。常见错误包括:镜面测试(重实现生产逻辑计算期望)、mock 回声室、一个测试塞入多个断言的巨型测试、共享可变夹具导致顺序依赖、用 sleep 掩盖不稳定、以及直接改期望值以让测试变绿。
writing-unit-tests
测试与质量
更新于 10-16 08:01