OPEN HYPER STEP
← 목록으로 (master-project)
MASTER-PROJECT · 33 / 50
master-project
CHAPTER 33 / 50
읽기 약 2
FUNCTION

백엔드 종합: API 전체 테스트


핵심 개념

Vitest·MSW·E2E Playwright·CI 통합 — 백엔드 8챕터 결과물 종합 테스트.

본문

단위 테스트 (Vitest)

BASH📋 코드 (1줄)
pnpm add -D vitest @testing-library/react @testing-library/jest-dom jsdom
TS📋 코드 (14줄)
// 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' },
  },
})
TS📋 코드 (14줄)
// 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)

TS📋 코드 (35줄)
// 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)

BASH📋 코드 (2줄)
pnpm add -D @playwright/test
pnpm exec playwright install chromium
TS📋 코드 (15줄)
// 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'] } },
  ],
})
TS📋 코드 (21줄)
// 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 로컬)

BASH📋 코드 (5줄)
pnpm supabase start  # 로컬 PostgreSQL + Auth + Storage

# 테스트용 .env.test.local
NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=...

CI 통합

YAML📋 코드 (8줄)
# .github/workflows/ci.yml
- name: Run tests
  run: |
    pnpm supabase start
    pnpm test
    pnpm test:e2e
  env:
    NEXT_PUBLIC_SUPABASE_URL: http://localhost:54321

백엔드 종합 체크리스트

📋 코드 (15줄)
[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