티스토리 뷰
반응형
React 앱 테스트 전략 – 유닛 테스트부터 E2E까지
React로 앱을 개발할 때,
기능은 동작하는데 실제 유저가 제대로 사용할 수 있는지 확신이 없을 때가 많습니다.
이런 불확실성을 줄이기 위해 테스트 코드를 작성하는 것이 중요합니다.
이번 글에서는 React 앱을 위한 테스트 전략 전체 흐름을 소개하고,
Jest + React Testing Library를 활용한 유닛 테스트,
Cypress를 통한 E2E 테스트 작성법까지 단계적으로 정리해보겠습니다.
✅ 왜 테스트가 필요한가?
- 기능 추가 시 기존 코드가 깨지지 않았는지 확인
- 리팩토링 후 버그 없이 동작하는지 보장
- 협업 시 신뢰성 확보
- 제품의 품질을 자동으로 검증할 수 있음
🧪 테스트 종류와 역할
반응형
종류 도구 설명
유닛(Unit) 테스트 | Jest + RTL | 개별 함수/컴포넌트 단위 테스트 |
통합(Integration) 테스트 | Jest + RTL | 여러 컴포넌트가 함께 동작하는 흐름 테스트 |
E2E(End-to-End) 테스트 | Cypress / Playwright | 실제 사용자가 사용하는 전체 시나리오 테스트 |
🔧 기본 환경 구성 (Jest + RTL)
npm install --save-dev jest @testing-library/react @testing-library/jest-dom @testing-library/user-event
package.json에 추가
"scripts": {
"test": "jest"
}
🔹 유닛 테스트 예제 – 버튼 클릭 테스트
// Counter.tsx
export function Counter() {
const [count, setCount] = useState(0);
return (
<>
<p>카운트: {count}</p>
<button onClick={() => setCount((c) => c + 1)}>+1</button>
</>
);
}
// Counter.test.tsx
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { Counter } from "./Counter";
test("버튼 클릭 시 카운트 증가", () => {
render(<Counter />);
const button = screen.getByText("+1");
userEvent.click(button);
expect(screen.getByText("카운트: 1")).toBeInTheDocument();
});
✅ 테스트는 기능 설명 → 실행 → 검증 순서로 작성
🔹 입력(Form) 테스트
// Form.tsx
export function Form() {
const [value, setValue] = useState("");
return (
<input
placeholder="이름 입력"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
);
}
// Form.test.tsx
test("입력 필드 변경 테스트", () => {
render(<Form />);
const input = screen.getByPlaceholderText("이름 입력");
userEvent.type(input, "Alice");
expect(input).toHaveValue("Alice");
});
🔍 통합 테스트 예시 – 로그인 흐름
test("이메일과 비밀번호 입력 후 로그인 버튼 클릭", () => {
render(<LoginForm />);
userEvent.type(screen.getByLabelText("이메일"), "test@example.com");
userEvent.type(screen.getByLabelText("비밀번호"), "123456");
userEvent.click(screen.getByRole("button", { name: "로그인" }));
expect(screen.getByText("환영합니다")).toBeInTheDocument();
});
✅ 실제 사용자의 행동을 그대로 흉내내는 방식
🧭 E2E 테스트 – Cypress 소개
설치
npm install --save-dev cypress
npx cypress open
기본 테스트 예제
describe("홈 페이지 테스트", () => {
it("타이틀이 보인다", () => {
cy.visit("http://localhost:3000");
cy.contains("React 앱에 오신 걸 환영합니다");
});
});
✅ 실제 브라우저에서 돌아가는 사용자 시나리오 테스트
🧠 오늘의 요약
항목 설명
유닛 테스트 | 컴포넌트/함수 단위 테스트 (Jest + RTL) |
통합 테스트 | 여러 컴포넌트와 흐름 테스트 |
E2E 테스트 | 전체 사용자 시나리오 테스트 (Cypress) |
테스트 도구 | jest, @testing-library/react, cypress |
테스트 작성법 | 사용자 관점으로 구성 + 역할 중심 테스트 |
🧪 실습 과제
- 버튼 클릭 후 상태가 변하는 컴포넌트를 테스트해보세요
- 사용자 입력 필드(Form) 테스트 작성
- Cypress로 메인 페이지 접근 후 텍스트 노출 여부 확인
📌 다음 글 예고
👉 React 프로젝트에서 성능 최적화 실전 전략 – Lazy Loading, 코드 분할, 메모이제이션까지
- 페이지 단위 Lazy Load
- React.lazy, Suspense 사용법
- bundle 크기 최적화 전략 정리
React 테스트, React Testing Library, Jest 테스트, Cypress E2E, 컴포넌트 테스트, React 유닛 테스트, 입력 폼 테스트, React 테스트 코드, 상태 변경 테스트, React QA 자동화
'framework > React' 카테고리의 다른 글
React + Firebase 인증 구현하기 – 이메일 로그인부터 소셜 로그인까지 (0) | 2025.04.24 |
---|---|
React 프로젝트 성능 최적화 전략 – Lazy Loading, 코드 분할, 메모이제이션까지 (0) | 2025.04.23 |
React Hook 사용 전략 – 커스텀 훅으로 비즈니스 로직 정리하기 (0) | 2025.04.18 |
React 프로젝트에 TypeScript 도입하기 – 실전 마이그레이션 가이드 (0) | 2025.04.17 |
React 상태 관리 라이브러리 비교 – Context vs Redux vs Zustand (0) | 2025.04.16 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Ktor
- PostgreSQL
- gatsbyjs
- 개발블로그
- kotlin
- 프론트엔드
- rag
- fastapi
- Webpack
- NestJS
- Prisma
- seo 최적화 10개
- CI/CD
- nextJS
- 스마트 컨트랙트
- AI챗봇
- Docker
- SEO 최적화
- SEO최적화
- LangChain
- 백엔드개발
- App Router
- Next.js
- llm
- nodejs
- REACT
- github
- AI 자동화
- 관리자
- 웹개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형