PromleeBlog
sitemap
aboutMe

posting thumbnail
사용자 행동 기반 테스트 작성 - React로 시작하는 TDD 3편
Writing User Behavior-Based Tests - TDD with React Part 3

📅

🚀

들어가기 전에 🔗

지난 2편에서 우리는
Vite
Next.js
환경에 테스트 도구를 설치했습니다.
하지만 막상 테스트 코드를 짜려고 하면 이런 고민이 듭니다.
"state를 테스트해야 하나?"
"div 태그를 id로 찾아야 하나?"

오늘은
React Testing Library(RTL)
의 핵심 철학인 사용자 행동 기반 테스트가 무엇인지 배우고, TDD의 첫 단계인
실패하는 테스트
를 작성해 보겠습니다.

🚀

UI가 아닌 사용자 관점 테스트 🔗

과거의 프론트엔드 테스트(Enzyme 등)는 컴포넌트의
내부
를 들여다보는 방식이었습니다.
"state에 count 변수가 1 증가했는가?"를 확인했죠.

하지만
RTL
은 다릅니다. 철저히
사용자
(User)의 입장에서 생각합니다.
사용자는 코드가 어떻게 짜여 있는지 모릅니다. 그저 화면에 보이는 버튼을 누르고, 숫자가 바뀌는 것을 볼 뿐입니다.
행동 기반 테스트
행동 기반 테스트

🚀

접근성 기반 쿼리 사용 (Queries) 🔗

테스트 코드가 화면 요소를 찾을 때도 규칙이 있습니다.
divclass 이름으로 찾는 것은 좋지 않습니다. 디자인이 바뀌면 테스트도 깨지기 쉽거든요.
대신
접근성
(Accessibility)역할을 기반으로 요소를 찾아야 합니다.

쿼리 우선순위 🔗

RTL 공식 문서에서는 다음 순서로 요소를 찾기를 권장합니다.

🚀

시나리오 설정: 카운터 만들기 🔗

이론은 충분하니 실습을 해봅시다.
우리가 만들 기능은 아주 간단한
숫자 카운터
입니다.

요구사항 정리 🔗

  1. 화면에 "현재 숫자: 0"이라는 텍스트가 보여야 한다.
  2. "+"라고 적힌 버튼이 있어야 한다.
  3. "+" 버튼을 클릭하면 숫자가 1로 증가해야 한다.

🚀

실패하는 테스트 작성 (Red) 🔗

TDD의 시작은
Red
(실패)입니다.
컴포넌트 파일(Counter.tsx)을 만들지도 않은 상태에서, 테스트 파일부터 만듭니다.
src/components 폴더를 만들고 그 안에 Counter.test.tsx를 생성해 주세요.
src/components/Counter.test.tsx
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
// Counter 컴포넌트는 아직 없지만 import 합니다 (에러 발생 예정)
import Counter from './Counter'; 
 
describe('Counter 컴포넌트 동작 테스트', () => {
  
  test('초기값은 0이며, + 버튼을 누르면 숫자가 1 증가한다', async () => {
    // 1. User Event 설정 (사용자의 동작을 시뮬레이션하는 객체)
    const user = userEvent.setup();
 
    // 2. 렌더링 (아직 컴포넌트가 없어서 여기서 빨간 줄이 뜹니다)
    render(<Counter />);
 
    // 3. 요소 찾기 (쿼리)
    // "현재 숫자: 0"이라는 텍스트가 있는지 확인
    const initialText = screen.getByText('현재 숫자: 0');
    // "+" 라는 이름을 가진 버튼(role=button) 찾기
    const incrementBtn = screen.getByRole('button', { name: '+' });
 
    // 4. 초기 상태 검증
    expect(initialText).toBeInTheDocument();
    expect(incrementBtn).toBeInTheDocument();
 
    // 5. 사용자 행동 (클릭)
    await user.click(incrementBtn);
 
    // 6. 결과 검증
    // 클릭 후에는 "현재 숫자: 1"이 화면에 보여야 함
    expect(screen.getByText('현재 숫자: 1')).toBeInTheDocument();
  });
});

코드 분석 🔗

이 테스트 코드는 사용자 관점에서 아주 자연스럽게 읽힙니다.

🚀

테스트 실행 🔗

이제 터미널에서 테스트를 실행해 봅시다.
Terminal
npm test
테스트 결과
테스트 결과
결과는 당연히
실패
(FAIL)입니다.
애초에 Counter 컴포넌트가 없으니 파일 자체를 찾을 수 없다는 에러가 나거나, 컴포넌트를 빈 껍데기로 만들어도 요소를 찾을 수 없다는 에러가 날 것입니다.

여러분은 방금 TDD의 첫 번째 단계인
Red
를 달성했습니다.
우리가 무엇을 만들어야 할지 테스트 코드가 명확하게 알려주고 있습니다.

🚀

결론 🔗

소스 코드는 GitHub - Promleeblog/react-tdd-setup 에서 확인할 수 있습니다.
Terminal
git clone https://github.com/PROMLEE/my-tdd-app.git
cd my-tdd-app
git checkout part3
오늘은 React TDD의 핵심인 사용자 행동 기반 테스트에 대해 알아보았습니다.
다음 시간에는 이 빨간색 에러를 초록색으로 바꾸는
4편. 테스트를 통과시키는 기본 컴포넌트 구현
을 진행하겠습니다.
감사합니다.

참고 🔗