FEํ ์คํธ(1)
๐์์ํ๋ฉฐ
๋๋์ด ์ด ๋ ์ด ์๋ค ๊ฐ์ธ์ ์ผ๋ก ํ๋ก ํธ์๋ ํ
์คํธ์ ํฅ๋ฏธ๊ฐ ์์ด ์ธํ๋ฐ์์ ๊ฐ์๋ฅผ ์๊ฐํ์๊ณ , ํ๋์์ ํ
์คํธํด๋ณผ ๋งํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ํ
์คํธ๋ฅผ ์์ฑํ๋ ์๊ฐ์ ๊ฐ์ก๋ค.
ํ๋ก ํธ์๋ ํ ์คํธ์ ๋ํด โ์ ๋ง ํ์ํ๊ฐ?โ๋ผ๋ ์๊ฒฌ๋ ์์ง๋ง, ๋๋ ํ ์คํธ์ ๊ธ์ ์ ์ธ ์ ์ฅ์ด๋ค.
์ด์ ๋, ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ ์งํ์ ์์์น ๋ชปํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ต๋ํ ์ค์ด๊ณ ์ถ๋ค๋ ๊ฒ๊ณผ, ํ ์คํธ ์์ฑ์ ํตํด ๋ ๋์ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.๐ค
๊ทธ๋์ vitest์ react Testing Library๋ฅผ ์ฌ์ฉํด ํ ์คํธํ๋ ๋ด์ฉ์ ์ ์ฒด์ ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
(์์ง ๊ณต๋ถ์ค์ด๋ผ ๋ด์ฉ์ด ์ ํํ์ง ์์ ์ ์๋ค๐ )
โ Vitest
์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด, Vitest๋ Vite๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํ
์คํธ ๋๊ตฌ๋ก์, Vite์ ์ค์ ํ์ผ์ธ vite.config.ts
ํ์ผ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ, ๋น๋, ํ
์คํธ ํ๊ฒฝ์ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํ ์ ์๋ค.
๋ํ, Vitest๋ ๊ธฐ์กด ํ ์คํธ ๋๊ตฌ์ธ Jest์ ํธํ๋๋ API๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ชจํน, ์ค๋ ์ท, ์ปค๋ฒ๋ฆฌ์ง ๋ฑ ํ ์คํธ์ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํฌ๊ฒ Vitest์ ์ฅ์ ์ ์๋ 4๊ฐ์ง๋ค.
- Vite์์ ํตํฉ
- ๋น ๋ฅธ ์๋
- ๊ฐ๋ฒผ์
- API ํธํ์ฑ
์ด๋ฌํ ์ฅ์ ์ ๋ฐํ์ผ๋ก ํ ์คํธ๋ Vitest๋ฅผ ํตํด ์ ํ๊ฒ ๋์๋ค.
โ React Testing Library
(React) Testing Library๋ ์ฌ์ฉ์ ์ค์ฌ์ ๋ฐฉ์์ผ๋ก UI ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ๋ ๋ฐ ๋์์ ์ค๋ค.
์๋ฅผ ๋ค์ด, Testing Library์์ ์ ๊ณตํ๋ DOM Testing Library๋ DOM ๋
ธ๋๋ฅผ ์ฟผ๋ฆฌํ๊ณ ์ํธ์์ฉํ๋ ๋ฐ ์ค์ ์ ๋๋๋ฐ, ์ด๋ ์ค์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ณผ ๋, ์ฃผ๋ก ์ํธ์์ฉํ๋ ์์์ธ ํ
์คํธ, ๋ ์ด๋ธ, ๋๋ ์ ๊ทผ์ฑ ์์ฑ(aria-label ๋ฑ)์ ์ด์ฉํด getByText
, getByRole
, getByLabelText
๊ฐ์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ DOM ์์์ ์ ๊ทผํ๋๋ก ๊ถ์ฅํ๊ณ ์๋ค.
โ Vitest์ React Testing Library
Vitest๋ ๋น ๋ฅด๊ณ ๊ฐํธํ ํ ์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๊ณ , Testing Library๋ ์ค์ ์ฌ์ฉ์๊ฐ ์น์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ ์ ๋ชจ๋ ํ์ฉํด FE ํ ์คํธ๋ฅผ ์์ฑํ๋ค.
โ ์ค์น
๋๋ ํ์ฌ Next.js๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, Next.js ๊ณต์๋ฌธ์์์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์๋ํ๋ค. pagesํด๋์ appํด๋ ๋ชจ๋ ์์ฑ๋๋๋ฐ pages ํด๋๋ ์ฌ์ฉํ์ง ์์์ ์ญ์ ํ๋ค.
1
npx create-next-app@latest --example with-vitest ํด๋ ์ด๋ฆ
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ์ค์นํด์ค๋ค. (์ด๋ react testing library๋ก ํฌํจ๋๋ค.)
1
2
3
npm install -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom
# or
yarn add -D vitest @vitejs/plugin-react jsdom @testing-library/react @testing-library/dom
๋๊ฐ์ง๋ฅผ ์ค์นํ๋ฉด ์๋์ผ๋ก vitest.config.ts
์ ํ์ํ ๋ช
๋ น์ด๊ฐ ์๋์ผ๋ก ์ธํ
๋๋ค.
1
2
3
4
5
6
7
8
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"test": "vitest"
}
}
โ Vitest ์ต์คํ ์
vs code์์ test๋ฅผ ์ฝ๊ฒ ์คํํ๊ณ ํ์ธํ๊ธฐ ์ํด Vitest ์ต์คํ ์ ์ ์ค์นํด์ฃผ์๋ค.
์ฌ์ฉ ๋ฒ์ ์ v1.0.7
์ผ๋ก, ์์ฑํ๋ ํ์ฌ ์ต์ ์ v1.2.8
์ด์ง๋ง ์ ์ ์ค์นํ ๋น์ ์์ฑํ ํ
์คํธ๋ฅผ ์ ๋๋ก ์ก์๋ด์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์์๊ณ , stack oveflow์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ฌ๋๋ค์ ์กฐ์ธ์ ๋ฐ๋ผ ๋ฒ์ ์ ๋ค์ด๊ทธ๋ ์ด๋ ํด ์งํํ๋ค.
โ Test code ํ์ผ๋ช
test ์ฝ๋๋ ์ปดํฌ๋ํธ์ด๋ฆ.test.tsx
๋๋ ์ปดํฌ๋ํธ์ด๋ฆ.spec.tsx
ํ์์ผ๋ก ์์ฑํ๋ค. test๋ ์๊ฒ ๋๋ฐ spec์ ๋ฌด์จ ์ด์ ์์ ์ฌ์ฉํ๊ฒ ๋์๋์ง ์ฐพ์๋ณด์๋๋ฐ,
- test.tsx: ํ ์คํธ ํ์ผ์์ ๋ํ๋ด๋ ์ผ๋ฐ์ ์ธ ์๋ฏธ
- spec.tsx: โspecificationโ์ ์ฝ์๋ก, ํน์ ์ปดํฌ๋ํธ๋ ํจ์์ ๋์์ ์ค๋ช ํ๋ ํ ์คํธ๋ฅผ ์๋ฏธ
ํ๋ค๊ณ ํ๋ค. ์ด ๋ถ๋ถ์ ํ์๊ณผ ์์ํด์ ํต์ผํ๋ฉด ์ข์ ๋ฏ ํ๋ค.
โ ๋จ์ ํ ์คํธ
ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์์, ํ ์คํธ๋ฅผ ์ง์นญํ๋ ์ฉ์ด๋ฅผ ์ง๊ณ ๋์ด๊ฐ๋ณด์. ๋จ์ ํ ์คํธ (Unit Test) ๋ ์ฑ์์ ๊ฐ๋ณ์ ์ธ ์์ ๋จ์(ํจ์๋ ๋ฉ์๋, ์ปดํฌ๋ํธ)๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๋๊ฒ์ ๋งํ๋ค. ์ ์ฒด ์์คํ ๋ณด๋ค๋ ํน์ ์์ ๋จ์์ ๋ํ ํ ์คํธ๋ผ๋ ํน์ง์ด ์๋ค.
๋ณดํต ๊ณตํต ์ปดํฌ๋ํธ๋ ๋จ์ ํ ์คํธ์ ์ ํฉํ๋ฐ, ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์์กด์ฑ์ด ์ ๊ณ , ์์ฃผ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์์ ์ฑ์ ๋์ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ ํตํฉ ํ ์คํธ
ํตํฉ ํ ์คํธ(Integration Test) ๋ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ํจ๊ป ๋์ํด์ผ ํ ๋ ์ฌ๋ฐ๋ฅธ ์ํธ์์ฉ์ด ์ด๋ฃจ์ด์ง๋์ง ํ์ธํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ๋จ์ ํ ์คํธ๋ณด๋ค ์กฐ๊ธ ๋ ํฐ ๋ฒ์์ ๊ฒ์ ํ ์คํธํ๋ ๊ฒ์ผ๋ก, ๋จ์ ํ ์คํธ๋ง์ผ๋ก๋ ์ ์ฒด ์์คํ ์ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ํจ๊ป ๋์ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.