Advanced

测试策略完全指南:Claude Code 实战

基于测试金字塔用 Claude Code 设计并实现单元测试、集成测试与 E2E 测试的完整实战指南。

用 Claude Code 设计并落地测试策略

测试固然该写,但到底写到什么程度、测什么,判断起来往往很难。借助 Claude Code,你可以基于测试金字塔推进一套策略清晰的测试设计和实现。

实践测试金字塔

> 帮我提一个项目测试策略。
> 基于测试金字塔,
> 把单元测试、集成测试、E2E 测试的
> 比例和覆盖对象整理出来。
测试类型比例目标工具
单元测试70%业务逻辑、工具函数Vitest
集成测试20%API、数据库联动、组件Vitest + Testing Library
E2E 测试10%核心用户流程Playwright

自动生成单元测试

> 帮 src/services/ 下所有函数生成单元测试。
> 覆盖正常路径、异常路径、边界值。
> 覆盖率目标 80% 以上。
// src/services/pricing.ts
export function calculatePrice(
  basePrice: number,
  quantity: number,
  discountRate: number
): number {
  if (quantity < 0) throw new Error("数量必须大于等于 0");
  if (discountRate < 0 || discountRate > 1) {
    throw new Error("折扣率必须在 0~1 之间");
  }
  const subtotal = basePrice * quantity;
  return Math.round(subtotal * (1 - discountRate));
}

// __tests__/services/pricing.test.ts
import { describe, it, expect } from "vitest";
import { calculatePrice } from "../../services/pricing";

describe("calculatePrice", () => {
  // 正常路径
  it("返回基础单价 × 数量", () => {
    expect(calculatePrice(100, 5, 0)).toBe(500);
  });

  it("应用折扣", () => {
    expect(calculatePrice(1000, 1, 0.1)).toBe(900);
  });

  it("小数四舍五入", () => {
    expect(calculatePrice(333, 3, 0.1)).toBe(899);
  });

  // 边界值
  it("数量为 0 时返回 0", () => {
    expect(calculatePrice(100, 0, 0)).toBe(0);
  });

  it("折扣率 100% 时返回 0", () => {
    expect(calculatePrice(100, 5, 1)).toBe(0);
  });

  // 异常路径
  it("负数量抛错", () => {
    expect(() => calculatePrice(100, -1, 0)).toThrow("数量必须大于等于");
  });

  it("越界折扣率抛错", () => {
    expect(() => calculatePrice(100, 1, 1.5)).toThrow("折扣率");
    expect(() => calculatePrice(100, 1, -0.1)).toThrow("折扣率");
  });
});

生成集成测试

针对 API 端点生成集成测试:

> 帮 /api/orders 端点写集成测试。
> 用测试数据库跑实际的 CRUD 流程。
> 确保测试之间不会互相干扰。
import { describe, it, expect, beforeEach, afterAll } from "vitest";
import request from "supertest";
import { app } from "../../app";
import { prisma } from "../../lib/prisma";

describe("Orders API Integration", () => {
  beforeEach(async () => {
    await prisma.order.deleteMany();
    await prisma.user.upsert({
      where: { id: "test-user" },
      update: {},
      create: { id: "test-user", email: "test@example.com", name: "Test" },
    });
  });

  afterAll(async () => {
    await prisma.$disconnect();
  });

  it("POST /api/orders 可以创建订单", async () => {
    const res = await request(app)
      .post("/api/orders")
      .set("Authorization", "Bearer test-token")
      .send({
        items: [{ productId: "P1", quantity: 2, price: 1000 }],
      });

    expect(res.status).toBe(201);
    expect(res.body.data.id).toBeDefined();
    expect(res.body.data.totalAmount).toBe("2000");
  });

  it("GET /api/orders 可以获取订单列表", async () => {
    // 准备测试数据
    await prisma.order.create({
      data: {
        userId: "test-user",
        totalAmount: 5000,
        status: "confirmed",
      },
    });

    const res = await request(app)
      .get("/api/orders")
      .set("Authorization", "Bearer test-token");

    expect(res.status).toBe(200);
    expect(res.body.data).toHaveLength(1);
  });
});

生成 E2E 测试

用 Playwright 测试核心用户流程:

> 用 Playwright 帮我写用户注册到登录的 E2E 测试。
import { test, expect } from "@playwright/test";

test.describe("用户注册与登录流程", () => {
  test("新用户注册到进入 Dashboard", async ({ page }) => {
    // 访问注册页面
    await page.goto("/register");
    await expect(page.getByRole("heading", { name: "新用户注册" })).toBeVisible();

    // 填写表单
    await page.getByLabel("邮箱").fill("newuser@example.com");
    await page.getByLabel("密码").fill("SecurePass123");
    await page.getByLabel("确认密码").fill("SecurePass123");

    // 提交注册
    await page.getByRole("button", { name: "注册" }).click();

    // 应重定向到 Dashboard
    await expect(page).toHaveURL("/dashboard");
    await expect(page.getByText("欢迎")).toBeVisible();
  });

  test("无效邮箱应显示错误提示", async ({ page }) => {
    await page.goto("/register");
    await page.getByLabel("邮箱").fill("invalid-email");
    await page.getByRole("button", { name: "注册" }).click();

    await expect(page.getByText("请输入有效的邮箱")).toBeVisible();
  });
});

改善测试覆盖率

> 帮我生成测试覆盖率报告,
> 给覆盖率低的文件补测试。
> 目标 80% 以上。
# Claude Code 执行的命令
npx vitest --coverage --run

TDD 的测试先行开发请参考 TDD 与 Claude Code,CI/CD 中的自动化测试见 CI/CD 流水线搭建指南,调试中的测试用法见 调试技巧完全指南

总结

测试策略的关键在于判断”要测什么、测到什么级别”。让 Claude Code 带着测试金字塔意识去干活,就能高效搭出有效的测试体系。建议从单元测试起步,逐步扩展覆盖率。

测试框架的更多内容请参阅 Vitest 官方文档,Claude Code 相关内容请参阅 Anthropic 官方文档

#Claude Code #testing #测试策略 #Vitest #Playwright

让你的 Claude Code 工作流更上一层楼

50 个经过实战检验的提示词模板,现在就能复制粘贴到 Claude Code 中使用。

免费

免费 PDF:5 分钟看懂 Claude Code 速查表

关键命令、快捷键与提示词示例,整理在一页可打印的 A4 纸上。

下载 PDF
M

本文作者

Masa

深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。