TechBridge

ํ…Œ์ŠคํŠธ โ€” Jest + React Testing Library + Playwright E2E

โ† ๋ชฉ๋ก์œผ๋กœ

๐Ÿ“‹ ์‹ค์Šต ์•ˆ๋‚ด

โœ๏ธ CODE EDITOR (JSX)
โ–ถ ์‹คํ–‰ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.
๐Ÿ‘๏ธ ๋‚ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋‚ด ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ
๐ŸŽฏ ์™„์„ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ชฉํ‘œ
์œ„ ์—๋””ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ด ๊ฒฐ๊ณผ๋ฌผ๊ณผ ๋˜‘๊ฐ™์ด ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!
๐Ÿ’ก TODO ์ฃผ์„์„ ์ฑ„์›Œ์„œ ์œ„ ๊ฒฐ๊ณผ๋ฌผ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”
๐Ÿค– AI ์„ ์ƒ๋‹˜์—๊ฒŒ ์งˆ๋ฌธํ•˜๊ธฐ ์ด๋ฒˆ ๊ฐ•์˜ ์ „์šฉ โ–ผ
  ์„ ์ƒ๋‹˜์ด ๋‹ต๋ณ€ ์ค‘์ด์—์š”...
โš ๏ธ ํ•™์Šต ๊ด€๋ จ ์งˆ๋ฌธ๋งŒ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์—†๋Š” ์งˆ๋ฌธ์€ ์ž๋™์œผ๋กœ ํ•™์Šต์œผ๋กœ ์œ ๋„๋ฉ๋‹ˆ๋‹ค.
Q1. React Testing Library์—์„œ ๋ฒ„ํŠผ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€?
๐Ÿ’ก RTL์€ ์ ‘๊ทผ์„ฑ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. `getByRole`์€ ARIA ์—ญํ• ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ์•„ ์‹ค์ œ ์‚ฌ์šฉ์ž์™€ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. `getByTestId`๋Š” ์ตœํ›„ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Q2. ๋น„๋™๊ธฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ํ›„ ๋‚˜ํƒ€๋‚˜๋Š” ์š”์†Œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€?
๐Ÿ’ก `findByText`๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `waitFor`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ํด๋งํ•ฉ๋‹ˆ๋‹ค. `await screen.findByText("๋‚ด์šฉ")`์€ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. `findBy*` ์ฟผ๋ฆฌ๋Š” ํ•ญ์ƒ await๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Q3. `userEvent.setup()`์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์€?
๐Ÿ’ก `userEvent`๋Š” JSDOM ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Playwright๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chromium, Firefox, WebKit)๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, `userEvent`์™€๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. userEvent๋Š” ๋‹จ์ˆœ fireEvent๋ณด๋‹ค ์‹ค์ œ ์‚ฌ์šฉ์ž ๋™์ž‘(ํƒ€์ดํ•‘, ํด๋ฆญ ์‹œ ํฌ์ปค์Šค ์ด๋™ ๋“ฑ)์„ ๋” ์ •ํ™•ํžˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
Q4. Playwright E2E ํ…Œ์ŠคํŠธ์—์„œ `await expect(page).toHaveURL(/dashboard/)`์˜ ์˜๋ฏธ๋Š”?
๐Ÿ’ก `toHaveURL`์€ ํ˜„์žฌ ํŽ˜์ด์ง€ URL์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Playwright์˜ expect๋Š” ์ž๋™ ๋Œ€๊ธฐ(auto-wait) ๊ธฐ๋Šฅ์ด ์žˆ์–ด, ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€(๊ธฐ๋ณธ 5์ดˆ) ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์™„๋ฃŒ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
Q5. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, E2E ํ…Œ์ŠคํŠธ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๋ช…ํ•œ ๊ฒƒ์€?
๐Ÿ’ก ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(๋น ๋ฆ„, ์ €๋ ด, ๊ฐœ๋ณ„ ๋กœ์ง ๊ฒ€์ฆ) โ†’ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(์ค‘๊ฐ„, ์ปดํฌ๋„ŒํŠธ ์ƒํ˜ธ์ž‘์šฉ) โ†’ E2E(๋А๋ฆผ, ๋น„์Œˆ, ์‹ค์ œ ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค). ๊ฐ ์ธต์„ ๊ท ํ˜•์žˆ๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  E2E๋Š” ํ•ต์‹ฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋งŒ ์ปค๋ฒ„ํ•ฉ๋‹ˆ๋‹ค.
๐ŸŽ‰

ํ€ด์ฆˆ ํ†ต๊ณผ!

์ ์ˆ˜: 0์  โ€” ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

๋‹ค์Œ ๊ฐ•์˜๋กœ โ†’
๐Ÿ˜…

์•„์‰ฝ๋„ค์š”!

์ ์ˆ˜: 0์  โ€” 70์  ์ด์ƒ์ด ๋˜์–ด์•ผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.