지난 1편에서 우리는 왜 프론트엔드에도 테스트가 필요한지 알아보았습니다.
이제 이론 공부는 끝났으니, 실제로 내 컴퓨터에 실습 환경을 만들어 볼 차례입니다.
오늘은 React 프로젝트를 설치하고 실행하는 아주 기초적인 단계부터, 테스트 도구를 세팅하는 과정까지 하나씩 천천히 따라 해 보겠습니다.
1단계: React 프로젝트 생성하기 (Vite) 🔗
과거에는
Create React App (CRA)
을 많이 썼지만, 요즘은 더 빠르고 가벼운
Vite(비트)
를 표준처럼 사용합니다.
터미널(맥은 Terminal, 윈도우는 PowerShell)을 열고 아래 명령어를 입력해 주세요.
Terminal # 1. 프로젝트 생성 (my-tdd-app이라는 폴더가 만들어집니다) 선택은 모두 Enter 눌러 기본값으로 진행하세요.
npm create vite@latest my-tdd-app -- --template react-ts
# 2. 생성된 폴더로 이동
cd my-tdd-app
# 3. 필요한 라이브러리 내려받기 (이 과정이 꼭 필요합니다!)
npm install
npm create vite@latest
최신 버전의 Vite
를 사용하여 프로젝트를 만듭니다.
react-ts
React와 TypeScript가 적용된 템플릿을 사용하겠다는 뜻입니다. (요즘 실무에서는 TypeScript가 필수입니다.)
npm install
프로젝트에 필요한 모든 부품(라이브러리)을 인터넷에서 다운로드하여 node_modules 폴더에 설치합니다.
설치가 끝났으니 화면이 잘 나오는지 확인해 봐야겠죠?
터미널에 아래 명령어를 입력합니다.
Terminal
명령어를 치면 다음과 같은 메시지가 뜰 것입니다.
VITE v5.x.x ready in 250 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
이제 인터넷 브라우저(Chrome 등)를 켜고 주소창에
http://localhost:5173을 입력해 보세요.
화면에
Vite + React
로고가 빙글빙글 돌아가고 있다면 성공입니다!
이제 프로젝트 준비가 끝났으니, 테스트 도구를 설치하러 가봅시다.
3단계: 테스트 도구 설치 (Vitest & RTL) 🔗
Vite
로 만든 프로젝트는 매우 가벼워서, 테스트 도구가 기본으로 들어있지 않습니다.
우리는 다음 세 가지 도구를 설치해야 합니다.
Vitest
테스트를 실행해 주는 친구입니다. (기존의 Jest
보다 훨씬 빠릅니다.)
React Testing Library
React 컴포넌트를 가상으로 그려주는 도구입니다.
jsdom
브라우저가 없는 터미널 환경에서도 HTML을 이해할 수 있게 해주는 도구입니다.
터미널을 하나 더 열거나, 실행 중인 서버를 끄고(Ctrl + C) 아래 명령어를 입력하세요.
Terminal npm install -D vitest jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event
도구를 설치했으니 설정을 조금 만져줘야 합니다.
프로젝트 최상위 폴더에 있는
vite.config.ts 파일을 열어 수정합니다.
vite.config.ts import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
export default defineConfig ({
plugins: [ react ()] ,
// [추가] 테스트 설정
test: {
globals: true ,
environment: 'jsdom' ,
setupFiles: './src/setupTests.ts' ,
} ,
})
(참고: 빨간 줄이 뜬다면 vitest 타입 문제일 수 있습니다. 일단 넘어가셔도 실행에는 지장이 없습니다.)
src 폴더 안에
setupTests.ts 파일을 새로 만들고 아래 내용을 붙여넣으세요.
이 파일은 테스트가 시작되기 전에 "이 환경은 브라우저처럼 동작해라"라고 세팅해 주는 역할을 합니다.
src/setupTests.ts import '@testing-library/jest-dom' ;
마지막으로, 우리가 테스트를 편하게 실행할 수 있도록 단축 명령어를 등록합니다.
package.json 파일을 열어
scripts 부분을 수정합니다.
package.json {
"name" : "my-tdd-app" ,
"scripts" : {
"dev" : "vite" ,
"build" : "tsc -b && vite build" ,
"test" : "vitest" ,
"lint" : "eslint ." ,
"preview" : "vite preview"
},
// ... (생략)
}
모든 준비가 끝났습니다.
이제 진짜 테스트가 돌아가는지 확인해 볼까요?
src/App.test.tsx 파일을 만들고 아주 간단한 테스트 코드를 작성해 봅니다.
src/App.test.tsx import { render, screen } from '@testing-library/react' ;
import App from './App' ;
import { describe, it, expect } from 'vitest' ;
describe ( 'App 컴포넌트' , () => {
it ( '화면에 Vite + React 글자가 보여야 한다' , () => {
render (< App />);
// 화면에 해당 글자가 있는지 확인
expect (screen. getByText ( /Vite \+ React/ i )). toBeInTheDocument ();
});
});
이제 터미널에 명령어를 입력합니다.
Terminal
npm test
초록색 글씨로
PASS
가 뜬다면 TDD를 위한 모든 환경 구축이 완료된 것입니다!
만약
Vite
가 아니라
Next.js
를 사용하신다면 설정 방법이 조금 다릅니다.
최근
Next.js
공식 문서에서는
Jest
대신
Vitest
사용을 권장하는 추세이며, 설정 방법도 구체적으로 안내하고 있습니다.
아직 프로젝트를 만들지 않았다면, 예제가 포함된 명령어로 한 번에 설치할 수 있습니다.
Terminal npx create-next-app@latest --example with-vitest my-next-app
2. 수동 설정 (Manual Setup) 🔗
이미 프로젝트가 있다면 직접 라이브러리를 설치해야 합니다.
Next.js
에서
TypeScript
를 사용할 때 필요한 패키지들입니다.
Terminal # Next.js용 Vitest 관련 패키지 설치
npm install -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom vite-tsconfig-paths
vite-tsconfig-paths
Next.js
에서 자주 쓰는 절대 경로(예: @/components/...)를 테스트 환경에서도 인식하게 해주는 플러그인입니다.
프로젝트 최상위 경로(루트)에
vitest.config.mts 파일을 생성하고 아래 내용을 입력합니다.
(
Next.js
설정 파일과 충돌하지 않도록 별도로 만듭니다.)
vitest.config.mts import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig ({
plugins: [ tsconfigPaths (), react ()] ,
test: {
environment: 'jsdom' ,
} ,
})
package.json 파일에 테스트 실행 명령어를 추가합니다.
package.json {
"scripts" : {
"dev" : "next dev" ,
"build" : "next build" ,
"start" : "next start" ,
"test" : "vitest"
}
}
5. Next.js 테스트 작성 시 주의사항 🔗
Next.js
의 새로운 기능인 비동기 서버 컴포넌트(Async Server Components)는 아직
Vitest
에서 완벽하게 지원하지 않습니다.
따라서 단위 테스트(Unit Test)는 주로
동기식 서버 컴포넌트
나
클라이언트 컴포넌트
를 대상으로 작성하는 것을 권장합니다.
__tests__/page.test.tsx import { expect, test } from 'vitest'
import { render, screen } from '@testing-library/react'
import Page from '../app/page'
test ( 'Page 컴포넌트 렌더링 테스트' , () => {
render (< Page />)
// heading 태그(h1~h6) 중 이름이 'Home'인 요소를 찾습니다.
expect (screen. getByRole ( 'heading' , { level: 1 , name: 'Home' })). toBeDefined ()
})
Terminal git clone https://github.com/PROMLEE/my-tdd-app.git
cd my-tdd-app
git checkout part2
오늘은 React 프로젝트를 바닥부터 생성하고 테스트 환경까지 구축해 보았습니다.
과정이 조금 길었지만, 한 번만 해두면 앞으로는 편하게 개발할 수 있습니다.
프로젝트 생성
npm create vite@latest
명령어로 빠르고 쉽게 React 환경을 만들었습니다.
도구 설치
Vitest
(실행기)와 RTL
(렌더링 도구)을 설치했습니다.
설정
vite.config.ts와 setupTests.ts를 통해 테스트가 브라우저처럼 동작하도록 설정했습니다.
다음 시간에는
3편. 사용자 행동 기반 테스트 작성
을 통해, 사용자가 버튼을 클릭하고 입력을 하는 과정을 어떻게 테스트 코드로 옮기는지 본격적으로 알아보겠습니다.