Advanced

完全指南:Claude Code 实战指南

了解complete guide:Claude Code 实战. 包含实用技巧和代码示例。

测试戦略を通过 Claude Code设计・实现する

测试は書いたほうがいいとわかっていても、どこまで書くべきか、何を测试すべきかの判断は難しいものです。借助 Claude Code,测试ピラミッドに基づいた戦略的な测试设计と实现を高效地進められます。

测试ピラミッドの実践

> 项目の测试戦略を提案して。
> 测试ピラミッド基于、
> 単体测试、集成测试、E2E 测试の
> 比率と対象を整理して。
测试種別比率対象ツール
単体测试70%ビジネスロジック、ユーティリティVitest
集成测试20%API、DB联动、组件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("数量は0以上");
  });

  it("範囲外の割引率でエラーを投げる", () => {
    expect(() => calculatePrice(100, 1, 1.5)).toThrow("割引率は0~1");
    expect(() => calculatePrice(100, 1, -0.1)).toThrow("割引率は0~1");
  });
});

集成测试の生成

API端点の集成测试を生成します。

> /api/orders 端点の集成测试创建。
> 测试用DBを使って実際の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: "[email protected]", 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 () => {
    // Tests数据创建
    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で测试します。

> 用户注册から日志インまでのE2E 测试を
> Playwrightで创建して。
import { test, expect } from "@playwright/test";

test.describe("ユーザー登録・ログインフロー", () => {
  test("新規ユーザー登録からダッシュボード表示まで", async ({ page }) => {
    // 注册页面にアクセス
    await page.goto("/register");
    await expect(page.getByRole("heading", { name: "新規登録" })).toBeVisible();

    // 表单输入
    await page.getByLabel("メールアドレス").fill("[email protected]");
    await page.getByLabel("パスワード").fill("SecurePass123");
    await page.getByLabel("パスワード確認").fill("SecurePass123");

    // 注册実行
    await page.getByRole("button", { name: "登録" }).click();

    // ダッシュボードにリダイレクトされる
    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