测试策略完全指南: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
M
本文作者
Masa
深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。
相关文章
Advanced
Claude Code Agent SDK入门 ― 快速构建自主智能代理
学习如何使用Claude Code Agent SDK构建自主AI代理。涵盖环境搭建、工具定义和多步执行,附带实践代码示例。
Advanced
Claude Code 上下文管理技巧完全指南
详解如何最大限度地利用 Claude Code 的上下文窗口。涵盖 Token 优化、对话分割和 CLAUDE.md 的使用方法。
Advanced
Claude Code Hooks 完全指南:自动格式化、自动测试等实用配置
详解如何通过 Claude Code Hooks 实现自动格式化和自动测试。包含实际配置示例和真实使用场景。