유닛 테스트(FE)

프론트엔드에서 컴포넌트, 함수, 훅 등의 최소 단위가 독립적으로 올바르게 동작하는지 검증하는 테스트입니다.

프론트엔드 유닛 테스트 대상

대상예시
유틸 함수날짜 포맷팅, 금액 변환, 유효성 검사
컴포넌트버튼 클릭 시 동작, 조건부 렌더링
커스텀 훅상태 변경, API 호출 로직
상태 관리Redux reducer, Zustand store

대표 도구

도구역할
Jest테스트 러너 + assertion 라이브러리
React Testing Library사용자 관점에서 컴포넌트 테스트
VitestVite 기반 프로젝트에 최적화된 테스트 러너

테스트 예시

1. 유틸 함수 테스트

// formatPrice.js
export const formatPrice = (price) => {
  return price.toLocaleString() + '원';
};

// formatPrice.test.js
describe('formatPrice', () => {
  test('금액에 콤마와 원을 붙인다', () => {
    expect(formatPrice(10000)).toBe('10,000원');
  });

  test('0원을 올바르게 처리한다', () => {
    expect(formatPrice(0)).toBe('0원');
  });
});

2. 컴포넌트 테스트 (React Testing Library)

// LoginButton.jsx
export const LoginButton = ({ isLoggedIn, onLogin, onLogout }) => {
  return isLoggedIn
    ? <button onClick={onLogout}>로그아웃</button>
    : <button onClick={onLogin}>로그인</button>;
};

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

describe('LoginButton', () => {
  test('로그아웃 상태이면 로그인 버튼을 보여준다', () => {
    render(<LoginButton isLoggedIn={false} onLogin={() => {}} />);
    expect(screen.getByText('로그인')).toBeInTheDocument();
  });

  test('로그인 버튼 클릭 시 onLogin이 호출된다', () => {
    const onLogin = jest.fn();
    render(<LoginButton isLoggedIn={false} onLogin={onLogin} />);
    fireEvent.click(screen.getByText('로그인'));
    expect(onLogin).toHaveBeenCalledTimes(1);
  });
});

3. 커스텀 훅 테스트

// useCounter.js
import { useState } from 'react';
export const useCounter = (initial = 0) => {
  const [count, setCount] = useState(initial);
  const increment = () => setCount(c => c + 1);
  return { count, increment };
};

// useCounter.test.js
import { renderHook, act } from '@testing-library/react';

describe('useCounter', () => {
  test('초기값이 올바르게 설정된다', () => {
    const { result } = renderHook(() => useCounter(5));
    expect(result.current.count).toBe(5);
  });

  test('increment 호출 시 count가 1 증가한다', () => {
    const { result } = renderHook(() => useCounter(0));
    act(() => result.current.increment());
    expect(result.current.count).toBe(1);
  });
});

BE vs FE 유닛 테스트 차이

항목BE (Java)FE (React)
테스트 대상Service, Repository컴포넌트, 훅, 유틸 함수
Mock 대상DB, 외부 APIAPI 호출, 브라우저 API
도구JUnit, MockitoJest, React Testing Library
검증 관점비즈니스 로직 결과렌더링 결과 + 사용자 인터랙션

CSLOG에서 보기