Skip to content

快照测试

定义

首次运行测试, 将测试结果保存为快照文件, 后续运行测试时, 将测试结果与快照文件进行对比, 如果测试结果与快照文件不一致, 则测试失败

相比断言测试

假设有一个 API 函数会返回复杂的数据结构, 如下所示:

ts
function getOrderDetails(orderId: string) {
  return {
    orderId,
    status: "shipped",
    items: [
      { id: 1, name: "商品A", price: 99.99, quantity: 2 },
      { id: 2, name: "商品B", price: 149.99, quantity: 1 }
    ],
    shipping: {
      address: "北京市朝阳区...",
      method: "快递",
      trackingNumber: "SF1234567890"
    },
    payment: {
      method: "支付宝",
      amount: 349.97,
      currency: "CNY"
    }
  };
}

如果使用断言测试, 需要大量代码, 如下所示:

ts
test("getOrderDetails - 传统断言", () => {
  const result = getOrderDetails("ORDER123");
  
  expect(result.orderId).toBe("ORDER123");
  expect(result.status).toBe("shipped");
  expect(result.items).toHaveLength(2);
  expect(result.items[0].name).toBe("商品A");
  expect(result.items[0].price).toBe(99.99);
  // ... 需要验证所有字段
});

但使用快照测试, 只需要一行代码, 如下所示:

ts
test("getOrderDetails - 快照测试", () => {
  const result = getOrderDetails("ORDER123");
  expect(result).toMatchSnapshot();
});

如果 API 返回的数据结构发生预期之内的变化, 只需要更新当前版本的快照文件即可

应用场景

  • 测试函数返回的复杂对象
  • 测试UI组件的渲染结果

具体代码示例参考 src/scenarios/snapshot/snapshot.test.ts

u 或者运行 vitest -u 手动更新快照文件