본문 바로가기
일상이 개발

React 공통 컴포넌트 테스트 자동화 전략 – 안정적인 UI를 위한 실전 가이드

by 디어노미 2025. 4. 12.
반응형

🧪 React 공통 컴포넌트 테스트 자동화 전략

React 앱을 개발하면서 가장 자주 반복되는 작업 중 하나는 공통 컴포넌트(Common Component)의 개발과 유지보수입니다. 버튼, 입력창, 모달, 토스트 등은 다양한 페이지와 기능에서 반복적으로 사용되므로, 이 컴포넌트들이 망가지면 전체 서비스에 영향을 주게 됩니다.

따라서 공통 컴포넌트의 안정성은 곧 서비스 품질과 직결되며, 이를 지키기 위해

자동화된 테스트

는 필수 전략이 됩니다.


⚙️ 왜 공통 컴포넌트 테스트가 중요한가?

다음과 같은 상황을 한 번쯤 겪어보셨을 겁니다:

  • 버튼 컴포넌트 스타일만 바꿨는데 예상치 못한 페이지에서 UI가 깨짐
  • Modal의 동작을 수정했더니 기존 페이지의 기능이 작동하지 않음
  • 입력 필드의 유효성 로직을 바꿨는데 로그인 폼이 작동 안 함

이러한 사이드 이펙트를 막기 위해선 단순 수동 테스트가 아니라, 자동 테스트로 반복 검증하는 전략이 필요합니다. 특히 CI/CD 파이프라인에서 자동 실행되도록 구성하면, 배포 전 오류를 빠르게 감지할 수 있습니다.


🛠 어떤 테스트를 작성해야 할까?

✅ 테스트 타입 정리

구분 설명 추천 도구
단위(Unit) 테스트 컴포넌트 단일 기능 검증 (렌더링, 로직 등) Jest + React Testing Library
스냅샷 테스트 렌더 결과 UI가 변경되지 않았는지 체크 Jest
비주얼 리그레션 화면이 시각적으로 깨지지 않았는지 비교 Storybook + Chromatic / Percy
E2E 테스트 사용자 흐름 단위 전체 확인 Cypress / Playwright

공통 컴포넌트 테스트에는 단위 테스트 + 스냅샷 테스트를 기본으로 구성하고, 디자인 안정성 확보가 중요한 경우 비주얼 리그레션도 함께 도입하는 것이 좋습니다.


📦 폴더 구조는 어떻게 구성할까?

/components
  └─ Button
       ├─ Button.tsx
       ├─ Button.test.tsx
       └─ Button.stories.tsx
  • Button.tsx: 컴포넌트 코드
  • Button.test.tsx: 유닛/스냅샷 테스트 코드
  • Button.stories.tsx: 스토리북에서 사용하는 컴포넌트 데모

컴포넌트별로 테스트 파일과 Storybook 파일을 같은 폴더에 위치시키면 유지보수와 테스트 연계성이 높아집니다.


🔍 실전 테스트 코드 예시

✅ 단위 테스트 (React Testing Library)

{`import { render, screen } from '@testing-library/react';
import Button from './Button';

test('버튼 텍스트가 정상 출력된다.', () => {
  render();
  expect(screen.getByText('확인')).toBeInTheDocument();
});`}

✅ 스냅샷 테스트

{`import renderer from 'react-test-renderer';
import Button from './Button';

test('Button UI는 변경되지 않아야 한다.', () => {
  const tree = renderer.create().toJSON();
  expect(tree).toMatchSnapshot();
});`}

스냅샷은 Git에 커밋되므로 UI 변경 사항을 추적하기 좋습니다.


🌈 Storybook으로 문서화 + 테스트

Storybook은 컴포넌트 문서화 도구이자 시각적 테스트 도구입니다. 공통 컴포넌트를 Storybook에 등록하면 다음을 수행할 수 있습니다:

  • UI 상태를 다양한 Props로 시각적으로 확인
  • 디자이너와 협업할 때 샘플 제공
  • 비주얼 리그레션 도구와 연계 가능 (Chromatic 등)

📄 예시: Button.stories.tsx

{`import { Button } from './Button';

export default {
  title: 'Common/Button',
  component: Button,
};

export const Primary = () => ;`}

Chromatic과 같은 도구를 연동하면 Pull Request 시 시각 변화가 생긴 컴포넌트를 자동 감지해 알려줍니다.


🤖 테스트 자동화 + CI 연동

테스트 자동화의 핵심은 CI 파이프라인에 테스트를 포함하는 것입니다.

🛠 GitHub Actions 예시

{`name: Test CI

on: [pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'

      - run: npm install
      - run: npm run test
`}

CI 도입 후에는 PR 생성 시 자동으로 테스트가 실행되며, 실패할 경우 병합이 차단되어 테스트 누락 문제를 방지할 수 있습니다.


📌 실전 적용 시 체크포인트

  • 테스트 가능한 컴포넌트 구조 만들기: 이벤트 핸들러 분리, 명확한 Props 사용
  • 테스트 커버리지 측정: Jest의 --coverage 옵션 활용
  • 디자인 변경 시 비주얼 테스트 필수: 스냅샷 또는 Storybook 기반 확인
  • 실제 유저 시나리오 중심 테스트: aria-label, role 기반 접근 권장

📣 조직 차원의 전략 팁

  • 컴포넌트 개발 시 테스트 코드 작성 의무화
  • 테스트 통과 없는 PR은 머지 금지 (CI 기반 체크)
  • 디자이너-프론트 협업을 위한 Storybook 공유
  • 신규 컴포넌트는 스토리 + 테스트 + 문서 3종 세트로 배포

이러한 전략을 통해 조직 내 컴포넌트 품질을 체계적으로 관리할 수 있습니다.


✅ 마무리 요약

공통 컴포넌트는 프로젝트 전반에 영향을 미치는 핵심 자산입니다.

자동화된 테스트는 이러한 자산의 안정성과 신뢰도를 지키는 가장 강력한 무기입니다.

🔑 핵심 요약

  • 테스트 기본 구성: 단위 + 스냅샷 + (비주얼 리그레션)
  • 도구: React Testing Library, Storybook, Chromatic, GitHub Actions
  • 폴더 구조: 컴포넌트 + 테스트 + 스토리 통합 관리
  • CI 연동: PR마다 테스트 자동 실행

테스트는 번거롭고 시간이 들 수 있지만, 장기적으로는 유지보수 비용을 크게 줄여줍니다.
작은 습관부터 하나씩 도입해보세요. 탄탄한 UI 시스템은 그 테스트에서 시작됩니다. 🚀

반응형