master-project
CHAPTER 33 / 50
읽기 약 2분
FUNCTION
백엔드 종합: API 전체 테스트
핵심 개념
Vitest·MSW·E2E Playwright·CI 통합 — 백엔드 8챕터 결과물 종합 테스트.
본문
단위 테스트 (Vitest)
pnpm add -D vitest @testing-library/react @testing-library/jest-dom jsdom// vitest.config.ts
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
setupFiles: ['./vitest.setup.ts'],
},
resolve: {
alias: { '@': '/src' },
},
})// src/lib/__tests__/rate-limit.test.ts
import { describe, it, expect, vi } from 'vitest'
import { rateLimit } from '../rate-limit'
vi.mock('@upstash/redis', () => ({
Redis: { fromEnv: () => ({}) },
}))
describe('rateLimit', () => {
it('returns success when under limit', async () => {
const result = await rateLimit('test:1', 10, 60)
expect(result.success).toBe(true)
})
})API 테스트 (MSW + Vitest)
// src/__tests__/api/generations.test.ts
import { describe, it, expect } from 'vitest'
describe('POST /api/generations', () => {
it('creates a generation when authenticated', async () => {
const res = await fetch('http://localhost:3000/api/generations', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Cookie: 'sb-access-token=test',
},
body: JSON.stringify({ prompt: 'test' }),
})
expect(res.status).toBe(201)
const body = await res.json()
expect(body.data.id).toBeDefined()
})
it('returns 401 when not authenticated', async () => {
const res = await fetch('http://localhost:3000/api/generations', {
method: 'POST',
body: JSON.stringify({ prompt: 'test' }),
})
expect(res.status).toBe(401)
})
it('returns 400 when prompt is empty', async () => {
const res = await fetch('http://localhost:3000/api/generations', {
method: 'POST',
headers: { Cookie: 'sb-access-token=test' },
body: JSON.stringify({ prompt: '' }),
})
expect(res.status).toBe(400)
})
})E2E 테스트 (Playwright)
pnpm add -D @playwright/test
pnpm exec playwright install chromium// playwright.config.ts
import { defineConfig } from '@playwright/test'
export default defineConfig({
testDir: './e2e',
webServer: {
command: 'pnpm dev',
port: 3000,
},
use: { baseURL: 'http://localhost:3000' },
projects: [
{ name: 'chromium', use: { browserName: 'chromium' } },
{ name: 'mobile', use: { ...devices['iPhone 13'] } },
],
})// e2e/auth.spec.ts
import { test, expect } from '@playwright/test'
test('로그인 → 대시보드', async ({ page }) => {
await page.goto('/login')
await page.fill('input[name="email"]', 'test@example.com')
await page.fill('input[name="password"]', 'password123')
await page.click('button[type="submit"]')
await expect(page).toHaveURL('/dashboard')
await expect(page.locator('h1')).toContainText('대시보드')
})
test('AI 생성 플로우', async ({ page }) => {
// 로그인 (helper)
await login(page, 'test@example.com')
await page.goto('/generate')
await page.fill('textarea[name="prompt"]', '여름 세일 카피')
await page.click('button:has-text("생성")')
await expect(page.locator('.result')).toBeVisible({ timeout: 30000 })
})통합 테스트 (Supabase 로컬)
pnpm supabase start # 로컬 PostgreSQL + Auth + Storage
# 테스트용 .env.test.local
NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=...CI 통합
# .github/workflows/ci.yml
- name: Run tests
run: |
pnpm supabase start
pnpm test
pnpm test:e2e
env:
NEXT_PUBLIC_SUPABASE_URL: http://localhost:54321백엔드 종합 체크리스트
[API 8챕터 결과물]
✓ CH.26 RESTful 엔드포인트 14개 설계
✓ CH.27 CRUD Server Action + Route Handler
✓ CH.28 인증 (Supabase JWT + middleware)
✓ CH.29 파일 (Storage + presigned)
✓ CH.30 실시간 (Postgres Changes)
✓ CH.31 검색 (FTS + tsvector)
✓ CH.32 웹훅 (Stripe + idempotency)
✓ CH.33 테스트 (단위·통합·E2E)
[코드 품질]
✓ TypeScript strict 0 errors
✓ ESLint 0 errors
✓ 테스트 커버리지 60%+ (목표)
✓ E2E 핵심 플로우 통과다음 챕터 (AI 시작)
CH.34 "AI 기능 설계: 어디에 AI를 넣을 것인가".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 마스터 프로젝트의 백엔드 종합 테스트 부분을 분석해서 실전 적용 + 개선 우선순위 3가지를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
백엔드 종합 테스트 관련 모범 사례·안티패턴 5개를 비교 분석해서 실전 적용를 위한 추천 방안을 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 백엔드 종합 테스트 최적화 가능 위치와 리스크를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 1인 개발자 시장의 백엔드 종합 테스트 트렌드와 차별화 포인트를 정리해줘.
⭐ 이것만 기억하세요
백엔드 종합: API 전체 테스트는 이 3가지만 확실히 잡으세요
1.Vitest 단위 + Playwright E2E + Supabase 로컬
2.CI에서 자동 실행 → main 보호
3.다음 챕터에서 AI 기능 설계
공유하기
진행도 33 / 50