ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ๊ณผ ๋งค์ฒ˜

date
2025-10-18
order
2

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ๊ณผ ๋งค์ฒ˜

ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ : ํƒœ์Šคํฌ ๋Ÿฌ๋„ˆ, ์–ด์„ค์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒ€์ฆ์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ (Vitest, Cypress ๋“ฑ)

Vitest ์„ค์ •

vite.config.jsํŒŒ์ผ์˜ test ํ•„๋“œ์— ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ๋Ÿ‰์ด ๋งŽ๋‹ค๋ฉด vitest.config.js๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ๋„ ํ•œ๋‹ค.

//vite.config.js
export default defineConfig({
  plugins: [react(), eslint({ exclude: ['/virtual:/**', 'node_modules/**'] })],
  test: {
    globals: true,
    environment: 'jsdom',
    setupFiles: './src/utils/test/setupTests.js',
  },
  resolve: {
    alias: [{ find: '@', replacement: path.resolve(__dirname, 'src') }],
  },
});



JSDOM

ํ…Œ์ŠคํŠธ๋Š” Node.js ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š”๋ฐ, ๋ธŒ๋ผ์šฐ์ € ์—†์ด HTML์˜ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. screen.debug()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์„ HTML ํƒœ๊ทธ๋“ค๋กœ ๋‚˜ํƒ€๋‚ด์ค€๋‹ค.

<body>
  <div>
    <input
      class="text-input my-class"
      placeholder="ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."
      type="text"
      value=""
    />
  </div>
</body>

it() ํ•จ์ˆ˜

ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๊ธฐ์ˆ ํ•˜์—ฌ ๊ฒ€์ฆ์„ ์‹คํ–‰ํ•œ๋‹ค. it ํ•จ์ˆ˜๋Š” ๊ฐ„๋‹จํžˆ test ํ•จ์ˆ˜์˜ alias. test ํ•จ์ˆ˜์™€์˜ ๊ธฐ๋Šฅ์ƒ์˜ ์ฐจ์ด๋Š” ์—†๋‹ค.

describe()

๊ธฐ๋ณธ์ ์œผ๋กœ itํ•จ์ˆ˜๋กœ ์ •์˜๋œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ '๋ฃจํŠธ'์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. describe ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ it ํ•จ์ˆ˜๋“ค์„ ๊ทธ๋ฃน์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

๋งค์ฒ˜ Matcher

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” API ์ง‘ํ•ฉ. (์œ„์˜ expect().toHaveClass())