본문 바로가기
일상이 개발

React 공통 컴포넌트 테스트 자동화 전략 – UI 품질을 지키는 실전 테스트 설계와 도구 활용법

by 아빠고미 2025. 5. 3.
반응형

React 공통 컴포넌트 테스트 자동화 전략 – UI 품질을 지키는 테스트 설계와 도구 활용법

재사용 가능한 컴포넌트는 프로젝트의 생산성을 끌어올리는 핵심 자산입니다. 하지만 이 컴포넌트들이 변경될 때마다 수동으로 화면을 하나하나 확인해야 한다면? 시간 낭비는 물론, 버그 발생률도 높아집니다.

React 공통 컴포넌트 테스트 자동화 전략 – UI 품질을 지키는 실전 테스트 설계와 도구 활용법

그래서 이번 글에서는 React 공통 컴포넌트의 테스트 자동화 전략을 중심으로, UI 품질을 유지하는 실전 테스트 설계와 도구 활용법을 단계별로 정리해드립니다.


1. 🧪 왜 공통 컴포넌트 테스트가 중요한가?

컴포넌트는 한 번 만들어 두면 다양한 곳에서 재사용됩니다. 특히 공통 UI 요소는 전체 앱의 UI 일관성을 좌우하죠.

❌ 테스트가 없을 때 생기는 문제

  • 버튼 하나 수정했더니, 다른 페이지에서 깨짐
  • 의도하지 않은 스타일 변경이 반영됨
  • 동작 오류를 QA 단계가 되어서야 발견

➡️ 이 모든 문제는 자동화된 테스트로 방지할 수 있습니다!


2. 🧠 테스트 대상 선정 기준

모든 컴포넌트를 테스트할 필요는 없습니다. 유지보수와 가치 대비 효율이 높은 항목을 중심으로 테스트를 설계해야 해요.

✅ 반드시 테스트해야 할 공통 컴포넌트

  • 📦 Button, Input, Select, Modal, Tooltip
  • 📋 Form 관련 컴포넌트
  • 📊 Chart, Table 같이 복잡한 UI

🔍 테스트 생략이 가능한 경우

  • 순수 스타일링 컴포넌트 (예: Spacer)
  • 한 페이지 내에서만 쓰이는 일회성 컴포넌트

👉 핵심은 재사용성과 사용자 입력이 발생하는 컴포넌트를 우선 테스트하는 것입니다.


3. 🔧 테스트 도구 선택 – 무엇을 언제 쓸까?

도구 용도 특징
Jest 기본 유닛 테스트 러너 빠르고, React와 궁합이 좋음
React Testing Library DOM 기반 상호작용 테스트 접근성 중심 API 제공
Storybook Test UI 시각화 + 테스트 통합 시나리오 단위 테스트에 강함
Playwright / Cypress E2E 테스트 전체 사용자 흐름 테스트

✨ 조합 추천

  • 유닛 테스트: Jest + RTL
  • 컴포넌트 테스트: Storybook + Testing Library
  • E2E 테스트: Playwright / Cypress

4. ✍️ React Testing Library로 공통 컴포넌트 테스트하기

React Testing Library(RTL)는 DOM 중심으로 사용자 관점의 테스트를 작성할 수 있게 해주는 강력한 도구입니다.

📌 설치

npm install --save-dev @testing-library/react @testing-library/jest-dom

✅ 예제: Button 컴포넌트 테스트

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

test('클릭 시 onClick 호출됨', () => {
  const onClick = jest.fn();
  render(<Button onClick={onClick}>확인</Button>);

  const button = screen.getByText('확인');
  fireEvent.click(button);

  expect(onClick).toHaveBeenCalledTimes(1);
});

이 테스트는 “버튼을 클릭하면 onClick 함수가 호출되어야 한다”는 가장 기본적인 동작을 검증합니다.

✅ 예제: Input 컴포넌트 입력값 변경

// Input.test.jsx
import { render, screen, fireEvent } from '@testing-library/react';
import Input from './Input';

test('입력값 변경 시 반영됨', () => {
  render(<Input placeholder="이메일" />);

  const input = screen.getByPlaceholderText('이메일');
  fireEvent.change(input, { target: { value: 'test@example.com' } });

  expect(input.value).toBe('test@example.com');
});

👉 이런 테스트를 통해 컴포넌트의 기본 동작을 빠르게 검증할 수 있습니다.


5. 📏 테스트 커버리지 측정 & 관리

“테스트를 작성했다”만으로는 부족합니다. 얼마나 빠짐없이 테스트했는지를 보여주는 커버리지 측정이 필요해요.

✅ 커버리지 확인 방법 (Jest)

npm test -- --coverage

📊 주요 커버리지 항목

  • Statements: 실행된 모든 코드 라인
  • Branches: 조건문 분기 (if, switch)
  • Functions: 호출된 함수
  • Lines: 커버된 코드 라인 수

🧠 권장 커버리지: Statements 80% 이상

📌 커버리지 시각화 도구

  • coverage/lcov-report/index.html 파일을 브라우저에서 열어 시각화 가능

6. 📚 Storybook과 테스트 통합하기

Storybook은 단순한 UI 문서 툴을 넘어, 자동 테스트와 시나리오 기반 검증까지 확장할 수 있는 플랫폼이에요.

✅ Storybook에 테스트 시나리오 추가

// Button.stories.jsx
import Button from './Button';

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

export const Default = () => <Button>확인</Button>;
Default.play = async ({ canvasElement }) => {
  const canvas = within(canvasElement);
  const button = await canvas.getByText('확인');
  await userEvent.click(button);
};

🎯 장점

  • 디자이너 & QA가 Storybook만 봐도 UI 상태 확인 가능
  • 테스트 시나리오와 문서가 통합되어 관리됨
  • CI 파이프라인에 Storybook test 포함 가능

7. 🚀 E2E 테스트로 전체 사용자 흐름 검증

유닛 테스트, 컴포넌트 테스트를 모두 거쳤어도 마지막 관문은 실제 사용자의 흐름을 따라가는 E2E 테스트입니다.

✅ 도구 비교

도구 특징
Playwright Microsoft 개발, 빠르고 API 강력
Cypress Vue/React 프로젝트에 친숙한 UI 테스트 환경

📌 기본 코드 예시 (Playwright)

// login.spec.ts
test('로그인 시 대시보드 이동', async ({ page }) => {
  await page.goto('/login');
  await page.fill('#email', 'test@example.com');
  await page.fill('#password', 'password');
  await page.click('button[type="submit"]');

  await expect(page).toHaveURL('/dashboard');
});

8. 🧠 마무리 – 테스트는 UI 품질을 지키는 방패

테스트는 귀찮고 어렵게 느껴질 수 있지만, 한번 체계를 잡아두면 **버그 방지, QA 시간 단축, 협업 속도 증가**라는 세 마리 토끼를 잡을 수 있어요.

✨ 핵심 정리

  • 공통 컴포넌트는 반드시 테스트하자
  • React Testing Library로 사용자 관점 테스트
  • Jest 커버리지로 빠짐없이 검증
  • Storybook으로 시각적 테스트 + 문서화
  • E2E 테스트로 전체 흐름 보장

테스트는 코드와 사용자 경험 사이의 신뢰를 연결하는 다리입니다. 이번 글이 여러분의 UI 품질 관리 전략에 도움이 되었길 바랍니다!


도움이 되셨다면 댓글, 공감, 공유로 응원해주세요 🙌

반응형