노트

React Testing Library

React Testing Library

프런트엔드#testing#react · 연결된 개념 5개

쉽게 말하면

React Testing Library는 컴포넌트를 처음 써 보는 사람처럼 다루는 테스트 도구예요. 새 리모컨을 받으면 회로를 뜯어보지 않고 버튼 글자를 읽고 눌러 보듯, 내부 상태 대신 '저장 버튼을 찾아 누르면 무엇이 보이나'만 확인해요.

비유가 깨지는 곳 RTL 혼자 다 하진 않아요. 렌더와 조작은 RTL이, 실행과 통과·실패 판정은 Jest나 Vitest가 맡아요. 서버 응답 뒤에 나타나는 요소는 getBy 대신 await findBy로 기다려요.

React Testing Library(RTL)는 컴포넌트를 jsdom 같은 테스트용 DOM(Document Object Model) 환경에 렌더하고, 사용자가 실제로 쓰는 방식으로 요소를 찾고 조작하게 해 주는 테스트 도구다. 내부 구현(state, 메서드)이 아니라 화면에 보이는 동작을 검증하라는 철학을 강하게 가진 라이브러리다.

  • 역할 분담: RTL은 렌더와 DOM 조작을 맡고, Jest·Vitest 같은 테스트 러너(Test Runner)가 테스트를 찾아 실행하고 통과·실패를 판정한다. Jest와 Vitest는 문법이 거의 같고 설정만 다르다. Vite 프로젝트는 Vitest가 빠르고 편하다
  • 테스트 함수가 에러를 던지면 실패, 아니면 통과다. 단언(Assertion, expect(...).toBeInTheDocument())이 실패하면 에러를 던진다. toBeInTheDocument·toBeVisible 같은 DOM 매처는 jest-dom이 준다

요소 찾기

[get | query | find][All]By[Role | LabelText | PlaceholderText | Text | DisplayValue | AltText …]
  • get: 있어야 하는 요소(없으면 에러). query: 없음을 확인할 때(null). find: 비동기로 나타나는 요소(await 필수)
  • Role이 1순위다. screen.getByRole('button', { name: /저장/ })처럼 접근성 정보로 찾으면 테스트가 곧 접근성 검사가 된다. 어떤 role이 있는지 모르면 logRoles(container)로 출력한다
  • 서버 응답 뒤에 나타나는 요소를 getBy로 찾으면 실패한다. await findBy…를 쓴다

조작과 설정

  • fireEvent보다 userEvent를 쓴다. const user = userEvent.setup() 후 await user.click(…), type, clear, hover. 모두 Promise다
  • Provider가 필요한 컴포넌트는 render(ui, { wrapper })를 쓰거나, 모든 Provider로 감싸는 custom render를 만들어 re-export한다
  • 함수 대역(Test Double): vi.fn()은 독립 모의 함수, vi.spyOn(obj, 'm')은 기존 메서드를 감시한다
  • 디버깅: screen.debug()로 그 시점 DOM을 찍고, test.only·test.skip으로 범위를 좁힌다

네트워크는 MSW로 API 모킹로 가로챈다. 단위·통합·E2E(End-to-End)의 균형은 테스트 피라미드, 테스트 먼저 쓰기는 테스트 주도 개발 (TDD), 깨지기 쉬운 테스트는 테스트 냄새.

출처: Testing Library - About Queries: Priority · user-event Introduction

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • DRF API 테스트

    DRF는 장고 테스트 위에 API 요청을 편하게 보내는 APITestCase와 APIClient를 제공한다. 장고 테스트 러너(test runner)는 테스트용 DB를 따로 만들고, 각 테스트를 트랜잭션으로 감싸 끝나면 되돌리므로 실제 데이터를 건드리지 않는다.

  • 자가 테스트 코드

    결과까지 스스로 판정하는 자동화된 테스트를 갖춘 코드. 사람이 출력을 눈으로 확인할 필요 없이 명령 하나로 "모두 통과"를 알 수 있어야 한다. 리팩터링의 전제 조건이다.

  • 설정 기반 UI

    화면 구조를 컴포넌트를 나열한 코드가 아니라 설정 데이터(보통 배열)로 선언하고, 렌더러가 그 설정을 읽어 그리는 패턴. 구조를 바꿀 때 렌더링 코드 대신 데이터만 고친다.

  • React Compiler

    React Compiler는 빌드 타임에 컴포넌트와 훅을 분석해 메모이제이션(Memoization) 코드를 자동으로 넣어 주는 컴파일러다. 개발자가 손으로 붙이던 useMemo·useCallback·memo를 대신한다. 2025년 10월 1.0이 나왔다.

  • 브라우저 안에서 도는 RAG 구현기

    서버·요금 없이 방문자 브라우저에서 EmbeddingGemma 2로 찾고 Gemma 4로 답하는 RAG를 이 사이트에 넣은 사례. 프론트엔드 개발자가 알아야 할 개념을 구현 순서대로 짚는다.

보기 옵션