工程效率与质量 / 进阶

测试金字塔落地:按风险选测试,不按数量凑比例

从系统边界和故障成本出发选择测试层级,让测试套件既快又能发现真正的问题。

测试层级对应不同问题

单元测试适合纯业务规则,集成测试负责数据库、队列和 HTTP 边界,端到端测试验证少量关键用户旅程。金字塔不是固定比例,而是在反馈速度和真实度之间分配预算。

价格计算:单元测试覆盖边界组合;仓储读写:集成测试使用真实数据库;下单主流程:端到端测试验证跨服务结果;第三方支付:契约测试加少量沙箱验证。

先测试行为,再测试实现

如果一次内部重构导致大量测试失败,测试很可能绑定了实现细节。断言公共输入输出、持久化结果和可观察副作用,不要逐行验证内部方法调用。Mock 只应替代难以控制的边界。

EXAMPLE / 02测试策略
it('库存不足时不创建订单并返回明确错误', async () => {
  inventory.setStock('sku-1', 0);

  await expect(placeOrder(input))
    .rejects.toMatchObject({ code: 'STOCK_NOT_ENOUGH' });
  expect(await orders.count()).toBe(0);
});

把反馈时间当成质量指标

PR 流水线应快速给出核心反馈,耗时更长的跨浏览器或全量回归可以并行或定时运行。持续记录测试耗时、失败率和重试率;一个需要反复重跑才变绿的套件不会带来信心。

同一规则若已被稳定的单元测试覆盖,就不必在十条 E2E 用例里重复穷举。E2E 应把预算留给集成风险。