티스토리 뷰
반응형
✅ Jest와 React Testing Library를 이용한 테스트 방법론
프론트엔드 개발에서 테스트 코드 작성은 안정성 확보의 핵심입니다.
React 애플리케이션에서 컴포넌트 단위 테스트와 통합 테스트를 위해 주로 사용하는 도구가 Jest와 **React Testing Library(RTL)**입니다.
이번 글에서는 기본 개념과 실무에서의 테스트 작성 방법을 중심으로 정리합니다.
📌 1. Jest와 React Testing Library란?
✅ Jest란?
- Facebook에서 개발한 테스트 러너이자 어설션 라이브러리입니다.
- 주로 **유닛 테스트(Unit Test)**와 **통합 테스트(Integration Test)**에 사용됩니다.
- 스냅샷 테스트를 통해 UI 변경을 감지할 수 있습니다.
✅ React Testing Library란?
- React 컴포넌트를 사용자 관점에서 테스트할 수 있도록 도와주는 라이브러리입니다.
- DOM을 직접 조작하기보다는 접근 가능한 방법으로 요소를 찾음 (예: getByRole, getByText).
📌 2. Jest 기본 사용법
✅ 설치
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
✅ 설정 (package.json)
"scripts": {
"test": "jest"
}
✅ 기본 테스트 구조
// sum.js
export function sum(a, b) {
return a + b;
}
// sum.test.js
import { sum } from './sum';
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
✅ 실행
npm test
📌 3. React Testing Library 사용법
반응형
✅ 기본 테스트 구조
// components/Button.js
export function Button({ label, onClick }) {
return <button onClick={onClick}>{label}</button>;
}
// components/Button.test.js
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from './Button';
test('버튼 클릭 시 콜백이 호출되는가?', () => {
const handleClick = jest.fn();
render(<Button label="클릭" onClick={handleClick} />);
const button = screen.getByText('클릭');
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
✅ 주요 메서드
메서드 설명
render() | 컴포넌트를 DOM에 렌더링 |
screen.getByText() | 특정 텍스트를 가진 요소 찾기 |
fireEvent.click() | 클릭 이벤트 발생 |
expect().toBe() | 값 비교 어설션 |
jest.fn() | 목 함수(Mock Function) 생성 |
📌 4. Jest와 RTL로 상태 테스트
✅ 상태 업데이트 테스트
// Counter.tsx
import { useState } from 'react';
export function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>증가</button>
</div>
);
}
✅ Counter.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import { Counter } from './Counter';
test('카운터 증가 버튼 클릭 시 상태가 변경되는가?', () => {
render(<Counter />);
const button = screen.getByText('증가');
fireEvent.click(button);
expect(screen.getByText('Count: 1')).toBeInTheDocument();
});
📌 5. 비동기 테스트
✅ 비동기 API 요청 테스트
// fetchData.js
export const fetchData = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve({ data: 'Success' });
}, 1000);
});
};
// fetchData.test.js
import { fetchData } from './fetchData';
test('비동기 데이터 요청이 성공하는가?', async () => {
const result = await fetchData();
expect(result.data).toBe('Success');
});
✅ 마운트 후 비동기 데이터 표시
// AsyncComponent.tsx
import { useEffect, useState } from 'react';
export function AsyncComponent() {
const [data, setData] = useState('');
useEffect(() => {
setTimeout(() => setData('비동기 데이터'), 1000);
}, []);
return <div>{data}</div>;
}
// AsyncComponent.test.tsx
import { render, screen, waitFor } from '@testing-library/react';
import { AsyncComponent } from './AsyncComponent';
test('비동기 데이터가 표시되는가?', async () => {
render(<AsyncComponent />);
await waitFor(() => {
expect(screen.getByText('비동기 데이터')).toBeInTheDocument();
});
});
📌 6. 스냅샷 테스트
✅ 스냅샷 생성
// Header.tsx
export function Header() {
return <h1>Hello World</h1>;
}
// Header.test.tsx
import { render } from '@testing-library/react';
import { Header } from './Header';
test('스냅샷과 UI가 일치하는가?', () => {
const { container } = render(<Header />);
expect(container).toMatchSnapshot();
});
✅ 스냅샷 업데이트
npm test -- -u
📌 7. 실무에서 겪은 문제와 해결
🧪 문제
- 버튼 클릭 시 상태 업데이트가 안 되어서 테스트가 실패함
✅ 해결
- 상태를 업데이트하는 함수가 비동기 함수여서 await 키워드로 감싸줌
await waitFor(() => {
fireEvent.click(button);
expect(screen.getByText('Count: 1')).toBeInTheDocument();
});
📌 면접에서 이렇게 답하세요
Jest는 테스트 러너로, React Testing Library는 DOM 상호작용을 테스트하는 도구입니다.
Jest는 유닛 테스트와 스냅샷 테스트를 주로 사용하며, RTL을 통해 사용자 관점에서 UI를 테스트할 수 있습니다.
실무에서는 상태 업데이트 테스트와 비동기 처리 테스트를 주로 진행하며, 목 함수를 통해 외부 의존성을 제거하여 안정적인 테스트 환경을 구축합니다.
Jest,ReactTestingLibrary,유닛테스트,스냅샷테스트,비동기테스트,프론트엔드테스트,React테스트,테스트자동화,프론트엔드면접,테스트전략
'AI + Career' 카테고리의 다른 글
✅ 프론트엔드 코드의 유지보수성과 확장성을 높이기 위한 설계 패턴 (0) | 2025.05.13 |
---|---|
✅ E2E(End-to-End) 테스트의 필요성과 사용하는 도구 (0) | 2025.05.12 |
✅ Lighthouse 성능 점수 향상을 위한 최적화 기법 (0) | 2025.05.08 |
✅ 이미지 최적화 기법 정리: WebP, Lazy Loading 등 (0) | 2025.05.07 |
✅ 웹사이트 성능 측정 방법과 개선 방법 정리 (0) | 2025.04.30 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- nodejs
- 파이썬 알고리즘
- llm
- gatsbyjs
- Webpack
- seo 최적화 10개
- 프론트엔드면접
- SEO최적화
- Next.js
- 백엔드개발
- Ktor
- LangChain
- 프론트엔드
- 웹개발
- 관리자
- Docker
- AI챗봇
- 개발블로그
- PostgreSQL
- github
- fastapi
- kotlin
- Prisma
- Python
- CI/CD
- NestJS
- nextJS
- REACT
- rag
- App Router
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형