ํ ์คํธ โ 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์ โ 70์ ์ด์์ด ๋์ด์ผ ํต๊ณผํฉ๋๋ค.