완전 가이드: 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공식 문서를 참고하세요.
Related Posts
Claude Code MCP Server 설정 및 실전 활용 가이드
Claude Code의 MCP Server 기능을 종합적으로 소개합니다. 외부 도구 연결, 서버 설정, 실전 통합 사례까지 한 번에 알아보세요.
Claude Code Hooks 완전 정복: 자동 포맷팅, 자동 테스트 설정법
Claude Code Hooks로 자동 포맷팅과 자동 테스트를 설정하는 방법을 알아봅니다. 실용적인 설정 예제와 실전 활용 사례를 포함합니다.
CLAUDE.md 작성 완벽 가이드: 프로젝트 설정 베스트 프랙티스
효과적인 CLAUDE.md 파일 작성법을 상세히 소개합니다. 기술 스택, 컨벤션, 프로젝트 구조를 Claude Code에 전달하여 출력 품질을 극대화하세요.