React Testing Library - 사용자 중심 테스트 작성하기
2026-02-10
REACTTESTINGTESTING-LIBRARY
React Testing Library는 사용자가 컴포넌트를 어떻게 사용하는지를 중심으로 테스트를 작성하도록 유도하는 테스트 도구입니다.
구현 세부사항보다는 사용자 관점의 동작을 검증하는 것이 핵심 철학입니다.
1. 기본 사용법
import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { Counter } from "./Counter"; test("카운터가 증가한다", async () => { const user = userEvent.setup(); render(<Counter />); const button = screen.getByRole("button", { name: /증가/i }); await user.click(button); expect(screen.getByText("1")).toBeInTheDocument(); });
screen.getByRole,screen.getByText등으로 요소를 찾습니다.userEvent로 사용자 상호작용을 시뮬레이션합니다.
2. 쿼리 우선순위
React Testing Library는 접근성 관점에서 쿼리 우선순위를 제안합니다.
getByRole(가장 권장)getByLabelTextgetByPlaceholderTextgetByTextgetByTestId(최후의 수단)
// ✅ 좋은 예 const button = screen.getByRole("button", { name: "제출" }); // ❌ 나쁜 예 const button = screen.getByTestId("submit-button");
3. 비동기 작업 테스트
test("데이터를 불러온다", async () => { render(<UserList />); // 데이터가 로드될 때까지 대기 const user = await screen.findByText("kwkang"); expect(user).toBeInTheDocument(); });
findBy*쿼리는 비동기적으로 요소를 찾습니다 (기본 timeout: 1000ms).
4. Mock과 MSW 활용
import { rest } from "msw"; import { setupServer } from "msw/node"; const server = setupServer( rest.get("/api/users", (req, res, ctx) => { return res(ctx.json([{ id: 1, name: "kwkang" }])); }) ); beforeAll(() => server.listen()); afterEach(() => server.resetHandlers()); afterAll(() => server.close());
- MSW(Mock Service Worker)로 API를 모킹하면 실제 네트워크 요청 없이 테스트할 수 있습니다.
5. 커스텀 훅 테스트
import { renderHook, act } from "@testing-library/react"; import { useCounter } from "./useCounter"; test("카운터 훅이 동작한다", () => { const { result } = renderHook(() => useCounter()); act(() => { result.current.increment(); }); expect(result.current.count).toBe(1); });
renderHook으로 커스텀 훅을 독립적으로 테스트할 수 있습니다.
6. 실무 팁
- 사용자 관점: "사용자가 이 화면에서 무엇을 할 수 있는가?"를 중심으로 테스트 작성
- 접근성:
getByRole을 우선 사용하면 접근성도 함께 검증 - 테스트 격리: 각 테스트는 독립적으로 실행되어야 함
- 과도한 테스트 금지: 구현 세부사항보다는 사용자 시나리오 중심
React Testing Library는 "테스트가 사용자와 가까울수록 더 신뢰할 수 있다"는 철학을 따릅니다.
컴포넌트의 내부 구현이 바뀌어도, 사용자 관점의 테스트는 계속 통과할 가능성이 높습니다.
