์ฐ์ํํ์ ๋ค ๋์์ธ ์์คํ ์ ์๊ฐ์ ํ๊ท ํ ์คํธ ์ ์ฉํ๊ธฐ
์ฐ์ํํ์ ๋ค ๋์์ธ ์์คํ ์ ์๊ฐ์ ํ๊ท ํ ์คํธ ์ ์ฉํ๊ธฐ ๊ด๋ จ
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์, ์ฐ์ํํ์ ๋ค ๋์์ธ ์์คํ โ์ฐ์ํ๊ณต๋ฐฉโ์ ์น ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ธ๊ต์, ์ด์์ ์ ๋๋ค.
์ฐ์ํ๊ณต๋ฐฉ์ ์ฐ์ํํ์ ๋ค์์ ์ด์ํ๋ ๋ค์ํ ์น/์ฑ ํ๋ก๋ํธ์์ ์ฌ์ฉ๋๊ณ ์๋๋ฐ์.
์ด๋ฒ ๊ธ์์๋ ์ฐ์ํ๊ณต๋ฐฉ์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๋์ ํ ๊ณผ์ ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์๊ฐ์ ํ๊ท ํ ์คํธVisual Regression Test๋ ์ฝ๋ ๋ณ๊ฒฝ ์ /ํ์ ์คํฌ๋ฆฐ์ท์ ๋น๊ตํด ์ฐจ์ด๋ฅผ ๊ฐ์งํ๊ณ ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๋ฅผ ํ์ธํ์ฌ UI์ ์๊ฐ์ ์ผ๊ด์ฑ์ ์ ๊ณตํ ์ ์๋๋ก ํ๋ ํ ์คํธ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋์์ธ ์์คํ ์ ์๊ฐ์ ํ๊ท ํ ์คํธ๊ฐ ์ ํ์ํ ๊น์?
์ฐ์ํ๊ณต๋ฐฉ์ ์ด 115๊ฐ์ง์ UI ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๊ณ ์์ด์. ์ฐ์ํ๊ณต๋ฐฉ์ ์ปดํฌ๋ํธ ๋จ์ ํ ์คํธ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ 91%๋ก ์ ์งํ๊ณ ์์ง๋ง, ๋จ์ ํ ์คํธ๋ก๋ ํ์ธํ ์ ์๋ UI ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค.
A ์ปดํฌ๋ํธ๋ฅผ ๋ณ๊ฒฝํ๋๋ฐ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์์กดํ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ชปํ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด์ A ์ปดํฌ๋ํธ์ ์์กดํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค.
๋ํ, ๋์์ธ ์์คํ ํจํค์ง์ ์คํ์ผ ์ฝ๋ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์น๋ ์์ ์ผ๋ก ์ธํด ๋ชจ๋ ์ปดํฌ๋ํธ์ UI ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋์ง ํ์ธํด์ผ ํ๊ธฐ๋ ํ์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ผ์ผ์ด ํ์ธํ๋ ๋ฐ์๋ ์๋นํ ์๊ฐ์ด ํ์ํ๊ณ , ๋ฏธ์ธํ ๋ณํ๋ ์์์ฐจ๋ฆฌ๊ธฐ ์ด๋ ต์ต๋๋ค. ์์์น ๋ชปํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ฉด ์ฑ์ ํ์ง์ ์ ํ์ํค๋ ์์ธ์ด ๋ ์ ์๊ณ ์ฌ์ฉ์์๊ฒ ๋ถํธํจ์ ์ค ์๋ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ปดํฌ๋ํธ์ ์๊ฐ์ ์์ ์ฑ์ ํ๋ณดํ๊ณ ์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๋์ ํ์ต๋๋ค.
๊ทธ๋ผ, ์ด์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ , ์ด๋ป๊ฒ ์์ ์ฑ์ ํ๋ณดํ ์ ์์๋์ง ๊ฐ์ด ์ดํด๋ณด์์ฃ !
ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑํ๊ธฐ
ํ ์คํธ๋๊ตฌ ์ ํ๊ธฐ
์๊ฐ์ ํ๊ท ํ
์คํธ๋ฅผ ์ง์ํ๋ ๋๊ตฌ์๋ Playwright, garris/BackstopJS
, Chromatic ๋ฑ์ด ์์ต๋๋ค. ์ ํฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก Playwright๋ฅผ ์ ํํ์ต๋๋ค.
- ๋ฌด๋ฃ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ํ๊ธ์ ์ง์ํฉ๋๋ค.
- ์ถํ E2E ํ ์คํธ(end-to-end test)๋ก ํ์ฅํ์ฌ ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
- HTML๋ก ์ ๊ณตํ๋ ํ ์คํธ ๋ฆฌํฌํธ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
Chromatic์ ๊ฒฝ์ฐ ์ ๋ฃ์ฌ์, BackstopJS๋ ํ๊ธ์ ์ง์ํ์ง ์์ ์ ์ธํ์ต๋๋ค.
ํ ์คํธ๋ฒ ๋ ์ ํ๊ธฐ
ํ ์คํธ๋ฒ ๋(Testbed)
์ํํธ์จ์ด ๊ฐ๋ฐ์ด๋ ์์คํ ํ ์คํธ๋ฅผ ์ํด ๊ตฌ์ฑ๋ ํ๊ฒฝ์ด๋ ํ๋ซํผ
์ฐ์ํ๊ณต๋ฐฉ์๋ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ์ํ ์ธ ๊ฐ์ง ํ๊ฒฝ์ด ์์ต๋๋ค.
- ์คํ ๋ฆฌ๋ถ: ๋์์ด๋๋ ์ฝ๊ฒ UI๋ฅผ ํ์ธํ ์ ์์ด์ ๋์์ธ QA ์ฉ๋๋ก ์ฌ์ฉํฉ๋๋ค.
- ํ ์คํธ ์ฑ: SSR(server-side rendering) ํ๊ฒฝ๊ณผ ๋ค์ํ ๋ฒ๋ค๋ฌ์์ ์ปดํฌ๋ํธ๊ฐ ์ ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํด์ ์ด์ํ๊ณ ์์ต๋๋ค.
- ๊ณต์ ๋ฌธ์ ์ฌ์ดํธ: ๋์์ด๋์ ๊ฐ๋ฐ์์๊ฒ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ์ด๋ํ๋ ์น์ฌ์ดํธ์ ๋๋ค.
์ ์ธ ๊ฐ์ง ์ค, ์ ํฌ๋ ์คํ ๋ฆฌ๋ถ์ ํ ์คํธ๋ฒ ๋๋ก ์ ํํ์ต๋๋ค. ๊ทธ ์ด์ ๋ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๋์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ตฌ์ฒด์ ์ธ ์ ์ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์์.
- ์๋ฆฌ๋จผํธ ์ ํ์ด ์ฌ์ธ ๊ฒ
- ์ถ๊ฐ ์ฝ๋ ์์ฑ์ด ์ ์ ๊ฒ
์๊ฐ์ ํ๊ท ํ ์คํธ์์ ๋น๊ตํ ์๋ฆฌ๋จผํธ๋ฅผ ์ ํํ๊ฒ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ฐ์. โ๊ณต์๋ฌธ์ ์ฌ์ดํธโ๋ ์ด ๊ณผ์ ์ด ๊น๋ค๋ก์์ ์ ์ธํ์ด์. โํ ์คํธ ์ฑโ์ ์๋ฆฌ๋จผํธ ์ ํ์ ๋น๊ต์ ์ฌ์ ์ผ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํ ์ฝ๋๊ฐ ์์ฑ๋ ์ํฉ์ด ์๋์ด์ ์ถ๊ฐ๋ก ์์ฑํด์ผ ํ ์ฝ๋๊ฐ ๋ง์์ ์ ์ธํ์ต๋๋ค.
๋ฐ๋ฉด, ์คํ ๋ฆฌ๋ถ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํ ์คํธ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ๋ถ๋ถ์ iframe์ผ๋ก ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ iframe ๊ฒฝ๋ก์ ์ ์ํ๋ฉด ์ปดํฌ๋ํธ๋ง ๋ ๋๋ง๋ ํ๋ฉด์ ํ์ธํ ์ ์์ต๋๋ค. ๋๋ถ์ ์คํฌ๋ฆฐ์ท์ ์ฐ์ ๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ ํํ ํ์๊ฐ ์์ต๋๋ค.
๋ํ ์ฐ์ํ๊ณต๋ฐฉ์์๋ ํ๋ก์ ํธ ์ด๊ธฐ๋ถํฐ ๊ฐ๋ฐ ๋ฐ ๋์์ธ QA ๋จ๊ณ์์ ์คํ ๋ฆฌ๋ถ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ์์ต๋๋ค. ์ด 115๊ฐ์ ์ปดํฌ๋ํธ์ ๋ํด ์ํ๋ณ ์คํ ๋ฆฌ๊ฐ ์ด๋ฏธ ์ ์์ฑ๋์ด ์์์ต๋๋ค. ๋๋ถ์ ๋ค๋ฅธ ํ ์คํธ๋ฒ ๋ ํ๋ณด์ ๋ฌ๋ฆฌ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์ํด ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ฑํ ํ์๊ฐ ์์ด ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์์ต๋๋ค.
ํ ์คํธ ์ฝ๋ ์คํํด๋ณด๊ธฐ
์คํฌ๋ฆฐ์ท ์ฐ๊ธฐ
์ด์ ์๊ฐ์ ํ๊ท ํ
์คํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด
์๋ค. Playwright์ toHaveScreenShot()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์คํฌ๋ฆฐ์ท์ ์ฐ๊ณ ๋น๊ตํ ์ ์์ต๋๋ค.
ํ
์คํธ๋ฅผ ์คํํ๋ฉด test-results
ํด๋์ ์๊ฐ์ ๋น๊ต์ ํ์ํ 3๊ฐ์ง ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ ์ด๋ฏธ์ง์ ํ์ผ๋ช
์ -expected
, -actual
, -diff
์ ๋ฏธ์ฌ๋ฅผ ๊ฐ์ง๋๋ค.
3๊ฐ์ง ์คํฌ๋ฆฐ์ท์ ๋ค์๊ณผ ๊ฐ์์.
- ๊ธฐ๋ํ ์ด๋ฏธ์ง(expected): ์ด์ ์ ์ ์ฅ๋ ์คํฌ๋ฆฐ์ท์ ๋๋ค.
- ์ค์ ์ด๋ฏธ์ง(actual): ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑ๋ ์คํฌ๋ฆฐ์ท์ ๋๋ค.
- ์ฐจ์ด ์ด๋ฏธ์ง(diff): โ๊ธฐ๋ํ ์ด๋ฏธ์งโ์ โ์ค์ ์ด๋ฏธ์งโ ๊ฐ์ ํฝ์ ์ฐจ์ด๋ฅผ ๊ฐ์กฐํ ์ด๋ฏธ์ง์ ๋๋ค. ํฝ์ ๋งค์น์ ๋ฐ๋ผ ์ด๋ค ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์๋์ง ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
๋ง์ฝ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ ํ ์ฒ์ ํ ์คํธ๋ฅผ ์คํํ๊ฑฐ๋, ์ปดํฌ๋ํธ๊ฐ ์๋ก ์ถ๊ฐ๋์ด ๋น๊ตํ ์คํฌ๋ฆฐ์ท(expected)์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋น๊ตํ โ๊ธฐ๋ํ ์ด๋ฏธ์ง(expected)โ๊ฐ ์์ผ๋, ํด๋น ํ ์คํธ๋ ์คํจํฉ๋๋ค.
์์ toHaveScreenShot()
์ 3๊ฐ์ง ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์์์ฃ . ํ์ง๋ง ์ด์ ์ ์ฐ์ด๋ ์คํฌ๋ฆฐ์ท์ด ์๋ ๊ฒฝ์ฐ์๋, ์ค์ง ํ์ฌ์ ์คํฌ๋ฆฐ์ท ์ด๋ฏธ์ง ํ๋๋ง ์์ฑํฉ๋๋ค. ๋์ ์ด ๋ ์์ฑํ ์ด๋ฏธ์ง๋ ๋ค์์ ์คํํ๋ ํ
์คํธ์์ โ๊ธฐ๋ํ ์ด๋ฏธ์ง(expected)โ๋ก์ ๋์ํ๊ณ , ๊ทธ ๋๋ถํฐ ๊ธฐ๋ํ ๋๋ก ํ
์คํธ๋ฅผ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
ํธ๋ฌ๋ธ์ํ : ์ผ๊ด๋ ์คํฌ๋ฆฐ์ท ํ๊ฒฝ ๊ตฌ์ฑํ๊ธฐ
ํ ์คํธ ์คํ ์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์คํฌ๋ฆฐ์ท์ด ๋ค๋ฅด๊ฒ ์ฐํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋๋ฐ์, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
a. ๋น ํ๋ฉด์ด ์คํฌ๋ฆฐ์ท์ผ๋ก ์ฐํ๋ ๋ฌธ์
ํ ์คํธ ํ์ด์ง๊ฐ ๋ก๋๋๊ธฐ ์ ์ ์คํฌ๋ฆฐ์ท์ด ์ฐํ ํ ์คํธ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ด์.
Playwright์์ ์ ๊ณตํ๋ {waitUntil : "networkidle"}
์ต์
์ ์ฌ์ฉํด ๋คํธ์ํฌ ์์ฒญ์ด ์์ ๋๊น์ง ๊ธฐ๋ค๋ ธ์ง๋ง ์นํ์ด์ง ๋ ๋๋ง์ด ๋๋๊ธฐ ์ ์ ์คํฌ๋ฆฐ์ท์ด ์ฐํ๋ ๋ฌธ์ ๋ ์ฌ์ ํ ๋ฐ์ํด์. ์นํ์ด์ง์ ๋ ๋๋ง์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ์คํฌ๋ฆฐ์ท์ ์ฐ์ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
๋ ๋๋ง์ด ์๋ฃ๋ ์์ ์ ์ด๋ป๊ฒ ์ ์ ์์๊น์?
๋จผ์ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ load
, domContentLoaded
๋ฅผ ๋ ์ฌ๋ ธ๋๋ฐ, ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ๋ฆฌ์กํธ์ ๊ฐ์ CSR ํ๊ฒฝ์์๋ ์ด ์ด๋ฒคํธ๋ก ๋ ๋๋ง์ด ์๋ฃ๋์์์ ๋ณด์ฅํ ์ ์์ผ๋๊น์. ๊ทธ๋์ MutationObserver๋ก DOM์ ๋ณํ๋ฅผ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ ์ ํํ์ต๋๋ค. MutationObserver์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ ๋๋ง์ด ์๋ฃ๋ ์์ ์ ํ์
ํ ์ ์์ต๋๋ค. ๋ ๋๋ง์ด ์์ ํ ์๋ฃ๋ ๊ฒ์ ํ์ธํ๊ณ , ์ดํ์ ํ
์คํธ ์ฝ๋๊ฐ ์คํ๋๋๋ก ํ์ด์.
ํ ์คํธ ์ฝ๋๋ Node ํ๊ฒฝ์์, MutationObserver๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์คํ๋ฉ๋๋ค. Node ํ๊ฒฝ๊ณผ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด ํต์ ํ ์ ์๋๋ก Playwright๊ฐ ์ ๊ณตํ๋ exposeFunction ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
exposeFunction์ ํจ์์ ์ด๋ฆ๊ณผ ์คํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์ด์ค๋๋ค. ์ด์ ๋ธ๋ผ์ฐ์ ์ window ๊ฐ์ฒด์์ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Node ํ๊ฒฝ์์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ผ์.
Playwright๊ฐ ์ ๊ณตํ๋ addInitScript ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ ์คํธ๊ฐ ์คํ๋๊ธฐ ์ ์ ์นํ์ด์ง์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ์ ์๋๋ก ํ์ด์. MutationObserver์ ์ฝ๋ฐฑ์๋ ์์ exposeFunction์์ ์์ฑํ ํจ์๋ฅผ ์คํํฉ๋๋ค.
MutationObserver์ ์ฝ๋ฐฑ์ด ์คํ๋๋ฉด DOM ๋ณํ๊ฐ ์๊ธด ๊ฒ์ผ๋ก ํ๋จํ๊ณ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ฝ๋ฐฑ์ด ๋ ์ด์ ์คํ๋์ง ์์ผ๋ฉด ๋ ๋๋ง์ด ๋๋ ๊ฒ์ผ๋ก ํ๋จํ๊ณ ํ ์คํธ๋ฅผ ๋ง์ ์คํํฉ๋๋ค.
b. ์ฐ์ ๋๋ง๋ค ๋ค๋ฅธ ์คํฌ๋ฆฐ์ท
์ด๊ธฐ ๋ ๋๋ง ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ํ์ด๋จธ ๋์ ๋๋ฌธ์ ์คํจํ๋ ๋ฌธ์ ๊ฐ ์์์ด์.
๊ธฐ๋ํ๋ ์คํฌ๋ฆฐ์ท์ ๋ฐฐ๋ ์ปดํฌ๋ํธ์ ์ฒซ ๋ฒ์งธ ์ฌ๋ผ์ด๋์์ง๋ง, ์ค์ ์คํฌ๋ฆฐ์ท์ ๋ ๋ฒ์งธ ์ฌ๋ผ์ด๋๊ฐ ์ฐํ์ด์. ์คํฌ๋ฆฐ์ท์ ์ฐ๊ธฐ ์ ์ ๋ฐฐ๋๊ฐ ๋ค์ ์ฌ๋ผ์ด๋๋ก ์ด๋ํ ๊ฒ์ด ๋ฌธ์ ์์ต๋๋ค.
๋ฐฐ๋ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ์ดํ, ์๋์ผ๋ก ๋ค์ ์ฌ๋ผ์ด๋๋ก ๋์ด๊ฐ๋๋ก ๋์ํด์. ์ด ๋์์ ๋ด๋ถ์ ์ผ๋ก setTimeout
์ ์ฌ์ฉํด์ ๊ตฌํ๋์ด ์์ด์. ์๋ํ์ง ์์ ์์ ์ ์คํฌ๋ฆฐ์ท์ด ์ฐํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ํ
์คํธ๋ฅผ ์ํํ๋ ๋์์๋ setTimeout
์ด ์คํ๋์ง ์๋๋ก ํ์ต๋๋ค.
์๊ฐ์ ํ๊ท ํ ์คํธ์์๋ ์์ ๊ฐ์ ์๊ฐ์ ์ํฅ์ ๋ฐ๋ ์์๋ฅผ ์ง์ ์ ์ผ๋ก ํ ์คํธํ์ง ์์ต๋๋ค. ์๊ฐ์ ์ํฅ์ ๋ฐ๊ฒ ๋๋ฉด ํ ์คํธ๋ฅผ ์คํํ ๋๋ง๋ค ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์์ง๊ธฐ ๋๋ฌธ์ด์์. ํ์ง๋ง, ์๊ฐ์ ์ํฅ์ ๋ฐ๋ ์์๋ค์ ์ปดํฌ๋ํธ์์ ์ค์ํ ์ญํ ์ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋จ์ ํ ์คํธ์์ ์๊ฐ์ ์์๋ฅผ ํ ์คํธ์ ํฌํจ์์ผ ์ปดํฌ๋ํธ์ ๋์์ ํ ์คํธํ ์ ์์ต๋๋ค.
CI๋ฅผ ํ์ฉํ ์๊ฐ์ ํ๊ท ํ ์คํธ
์์์ ์ค๋ช ํ ์๊ฐ์ ํ๊ท ํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์งํ๋๋์ง ๊ฐ์ด ํ์ธํด ๋ณผ๊น์?
์ ์ฒด์ ์ธ ํ๋ก์ธ์ค
Playwright๋ฅผ ํ์ฉํ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ CI(Continuous Integration) ํ๊ฒฝ์์ ์คํํ๊ณ ์์ต๋๋ค.
CI ํ๊ฒฝ์์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์คํํ๋ค๋ฉด, ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ์คํ๋๊ณ ํ ์คํธ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ด ํญ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ผ๊ด๋ ํ ์คํธ ํ๊ฒฝ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ํ MR(Merge Request)์์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋๋ก ๋ฆฌํฌํธ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
CI๋ฅผ ํ์ฉํ ์ ์ฒด์ ์ธ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๊ฐ์ ํ๊ท ํ ์คํธ ์คํํ๊ธฐ: ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธฐ๋ฉด, CI ํ์ดํ๋ผ์ธ์์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์คํํ๊ณ . ๋ฆฌํฌํธ๋ฅผ S3์ ์ ๋ก๋ํด์ MR์์ ํ์ธํ ์ ์๋๋ก ํฉ๋๋ค.
- ํ ์คํธ ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ: ๋ฆฌํฌํธ๋ก ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ํ ์คํธ ์คํจ ๋์ํ๊ธฐ: ํ ์คํธ๊ฐ ์ฑ๊ณตํด์ผ ๋จธ์ง ๊ฐ๋ฅํ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์, ํ ์คํธ๊ฐ ์คํจํ๋ค๋ฉด ๊ธฐ๋ํ ์ด๋ฏธ์ง์ ์ค์ ์ด๋ฏธ์ง๋ฅผ ์ผ์น์ํค๋๋ก ์์ ํด์ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋๋ก ํฉ๋๋ค.
์ด์ ์ด ๊ณผ์ ์ ํ๋์ฉ ์ดํด๋ณด์์ฃ .
1. ์๊ฐ์ ํ๊ท ํ ์คํธ ์คํํ๊ธฐ
CI ํ๊ฒฝ์์ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค.
- image: Microsoft Artifact Registry์์ ์ ๊ณตํ๋ Playwright ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค..
- rules:
merge request event
๋ก ์ธํด ํ์ดํ๋ผ์ธ์ด ์์๋๋ ๊ฒฝ์ฐ ํด๋น Job์ ํธ๋ฆฌ๊ฑฐํด ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก MR์ ์์ฑํ๊ฑฐ๋, MR์ ์์ฑํ ์ดํ ์๊ฒฉ์ ์ฅ์์ commit์ pushํ ๋ ์คํํด์. - script: ์ง์ ํ config ํ์ผ์ ์ฐธ์กฐํ์ฌ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
- artifacts: ๋ฆฌํฌํธ๋ฅผ artifacts๋ก ์ ๋ฌํด ๋ค์์ ์คํ๋ Job์์ ๋ฆฌํฌํธ๋ฅผ ์ ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค. Job์ ๋ถ๋ฆฌํ ์ด์ ๋ ๋ฆฌํฌํธ๋ฅผ ์ฐ์ํํ์ ๋ค ๋ด๋ถ๋ง S3 ๋ฒํท์ ์ฌ๋ ค์ผ ํ๋๋ฐ Playwright ์ด๋ฏธ์ง์์๋ ๋ด๋ถ๋ง์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด์์.
์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์๋ฃํ๋ฉด ๋ฆฌํฌํธ๋ฅผ ๋ฐฐํฌํ๊ณ ๋ฏธ๋ฆฌ๋ณด๊ธฐ URL์ ์์ฑํ๋ ๋จ๊ณ์ ์ง์ ํฉ๋๋ค.
- image: ์ฐ์ํํ์ ๋ค ์ฌ๋ด ๊ณต์ฉ ๋น๋ํท ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด ์ฌ๋ด๋ง S3 ๋ฒํท์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- script: artifacts๋ก ๊ณต์ ๋ฐ์ ๋ฆฌํฌํธ ํ์ผ์ s3์ ์ ๋ก๋ํ๊ณ ์ ๋ก๋ํ ๋ฒํท ๊ฒฝ๋ก๋ฅผ ๋ณ๋์ ๋ณ์์ ํ ๋นํฉ๋๋ค.
- environment: ๋ค์ํ ๋ฐฐํฌ ๋ฐ ์คํ ํ๊ฒฝ์ ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ MR์์ ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
name
์ ๊ฐ environment๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ผ๋ก ๋ธ๋์น๋ช ($CI_COMMIT_REF_SLUG
) ๋ณ์๋ฅผ ํ์ฉํด MR๋ง๋ค ๋ค๋ฅธ ํ๊ฒฝ์ ๊ฐ๋๋ก ํฉ๋๋ค.url
์ ํด๋น ํ๊ฒฝ์ ์ ๊ทผํ ์ ์๋ ์ฃผ์์ ๋๋ค. ๋ฆฌํฌํธ์ S3 ๋ฒํท ์ฃผ์๋ก ์ค์ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ ๋ฐ ์ถ๊ฐ๋ก ์ค์ ํด์ผ ํ๋ ๋ถ๋ถ์ Gitlab์ environments๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
2. ํ ์คํธ ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
MR ํ์ด์ง์์ ์ ๊ณตํ๋ ๋ฆฌํฌํธ๋ฅผ ํตํด CI์ ์ฑ๊ณต/์คํจ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ ์ด๋ฏธ์ง์์ ์๊ฐ์ ํ๊ท ํ ์คํธ Job(visual-test)๋ก ์ธํด CI ์คํจํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ํ ์คํธ๊ฐ ์คํจํ ์ด์ ๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ฆฌํฌํธ๋ฅผ ํ์ธํฉ๋๋ค. "View app" ๋ฒํผ์ ํด๋ฆญํ๋ฉด CI์ environment ๊ณผ์ ์ ๊ฑฐ์น๋ฉฐ ๋ง๋ค์ด์ง ํ๊ฒฝ(๋ฆฌํฌํธ)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ฆฌํฌํธ๋ฅผ ์ดํด๋ณผ๊ฒ์.
a. ๋ฉ์ธํ์ด์ง
๋ฆฌํฌํธ์ ๋ฉ์ธ ํ์ด์ง์์๋ ๊ฐ ํ ์คํธ ์ฑ๊ณต ์ฌ๋ถ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ํ์ธํ ์ ์๋ ๋ชฉ๋ก์ ์ ๊ณตํฉ๋๋ค. ํ ์คํธ๋ฅผ ํด๋ฆญํ๋ฉด ๊ฐ ํ ์คํธ์ ์์ธํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
b. ์์ธ ํ์ด์ง
์์ธ ํ์ด์ง๋ Errors, Test Steps, Image mismatch, Traces๋ก ๊ตฌ์ฑ๋์ด ์์ด์.
Errors
์๋ฌ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๊ธฐ๋ํ ์ด๋ฏธ์ง์ ์ค์ ์ด๋ฏธ์ง ์ฌ์ด์ 1970๊ฐ์ ํฝ์ , ์ฆ 1%์ ํฝ์ ์ฐจ์ด๊ฐ ์์ด์ ํ ์คํธ๊ฐ ์คํจํ์์ ์ ์ ์์ต๋๋ค.
Test Steps
ํ ์คํธ ์คํ ์ค ๊ฐ ๋จ๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ์์๋๋ก ๋ณด์ฌ์ค๋๋ค.
๋น๊ตํ๋ ๋ ์ด๋ฏธ์ง๊ฐ ๊ฐ์ ๊ฒ์ผ๋ก ์์ธกํ expect.toHaveScreenshot
๋จ๊ณ๋ง ์คํจํ์ด์. ๋ชจ๋ ๋จ๊ณ๋ ๋ฌธ์ ์์ด ๋์ํ๊ณ ์ด๋ฏธ์ง๊ฐ ์ด๊ธ๋์ ํ
์คํธ๊ฐ ์คํจํ๋ค๋ ๊ฒ์ ์ข ๋ ๋ช
ํํ ์ ์ ์์ต๋๋ค.
Image mismatch
ํ ์คํธ์ ํ์ํ ๊ธฐ๋ํ ์ด๋ฏธ์ง(Expected), ์ค์ ์ด๋ฏธ์ง(Actual), ๋น๊ต ์ด๋ฏธ์ง(Diff)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด UI ๋ณ๊ฒฝ ์ฌํญ์ ํ๋์ ์ ์ ์์ต๋๋ค.
Trace
์์ธํ์ด์ง์์ ์ ๊ณตํ๋ ์ ๋ณด๋ก ํ ์คํธ๊ฐ ์คํจํ ์ด์ ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ๋๋ trace ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋นจ๊ฐ ๋ค๋ชจ ์์ญ์ ํด๋ฆญํ๋ฉด ๋๋ฒ๊น ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
c. trace ํ์ด์ง
trace ํ์ด์ง์์๋ ๋ค์ํ ๋๋ฒ๊น ํ๊ฒฝ์ ์ ๊ณตํ๊ณ ์์ด์.
์๋จ์์๋ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ UI ๋ณ๊ฒฝ ์ฌํญ์, ์ข์ธก ์ฌ์ด๋๋ฐ์์๋ ํจ์ ์คํ์ ๋ฐ๋ฅธ UI ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค. ํ๋จ์์๋ ๊ฐ๋ฐ์ ๋๊ตฌ์ฒ๋ผ Console, Nextwork, Error ๋ฑ์ ํ์ธํ ์ ์์ด์ ์ด๋ ์์ ์, ์ด๋ค ์ด์ ๋ก ํ ์คํธ๊ฐ ์คํจํ๋์ง ์ ์ถํ ์ ์์ต๋๋ค.
3. ํ ์คํธ ์คํจ ๋์ํ๊ธฐ
ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ค๋ฉด ๋จธ์ง ๊ฐ๋ฅํ ์ํ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ฉด์ ํ ์คํธ๊ฐ ์คํจํ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋จธ์ง ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋ค์ด์ผ ํด์.
ํ ์คํธ๊ฐ ์คํจํ๋ ์ํฉ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค.
- ์์์น ๋ชปํ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ํ ์คํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ, ์ฝ๋๋ฅผ ์ง์ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
- ๋ณ๊ฒฝ๋ ๋์์ธ์ด๋ ๊ธฐ๋ฅ์ ๋ฐ์ํ๋ ๋ฑ ์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ํ ์คํธ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ, ์ค์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ํ ์ด๋ฏธ์ง๋ก ์ ๋ฐ์ดํธํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํ ํ ์คํธ ์คํจ ๋์ํ๊ธฐ
์์ ์๋ ์ค์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ํ ์ด๋ฏธ์ง๋ก ์ ๋ฐ์ดํธํ๋ ์๋ Job์ ์คํํด ์ด๋ฏธ์ง๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
Job(update-snapshot)์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค.
- when: manual ์ต์ ์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก Job์ ์คํํ๋๋ก ํฉ๋๋ค.
- script: Playwright๊ฐ ์ ๊ณตํ๋ ํ๋๊ทธ(
โupdate-snapshots
)๋ฅผ ์ฌ์ฉํด ์ค์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ํ ์ด๋ฏธ์ง๋ก ์ ๋ฐ์ดํธํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ pushํฉ๋๋ค.
ํด๋น Job์ ์คํํ๋ฉด ์๊ฐ์ ํ๊ท ํ ์คํธ๊ฐ ์ฑ๊ณตํด ๋จธ์ง ๊ฐ๋ฅํ ์ํ๊ฐ ๋ฉ๋๋ค.
์ด์ ์์ ์๊ฐ ๋ชจ๋ฅด๋ UI ๋ณ๊ฒฝ ์ฌํญ์ ์์ต๋๋ค. ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ํตํด ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ ํ์ ์ ๊ณตํ ์ ์๊ฒ ๋์์ด์!
๋ง์น๋ฉฐ
์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๊ตฌ์ถํ๋ค๋ฉด ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์์๋ ์ผ์ข ์ ๋ฐฉํ์ ์ญํ ๋ฟ๋ง ์๋๋ผ ๊ณ ๊ฐ ๊ฒฝํ๊ณผ ์ง๊ฒฐ๋ ์๋น์ค์์๋ ๋์ฑ ์ค์ํ ์ญํ ์ ํ ์ ์์ต๋๋ค.
์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๋์ ํ๊ธฐ ์ ์๋ ์ปดํฌ๋ํธ์ ๋ํ ์ํฅ๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์์ ์ฝ๋ ์์ ์ ์ฃผ์ ํ์์ต๋๋ค. ๋์ ํ์๋ ์ํฅ๋ฒ์๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ์คํ์ผ ์ํฅ ๋ฒ์๊ฐ ํฐ ์์ ์ ์งํํ ๋๋ ์ฝ๋ ์์ ์ ์์ ๊ฐ์ ์ป์ ์ ์์์ต๋๋ค.
์ง๊ธ๊น์ง ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๊ตฌ์ถํ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ ค๋๋ ธ๋๋ฐ์. ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ๊ตฌ์ถํ ์์ ์ด๊ฑฐ๋ ๊ด์ฌ์ด ๋ง์ ๋ถ๋ค์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค. ์ฐ์ํํ์ ๋ค ๋์์ธ ์์คํ ์ ์ ์ฉํ ์๊ฐ์ ํ๊ท ํ ์คํธ๋ ์์ง ์ด๊ธฐ ๋จ๊ณ์ธ๋ฐ์. ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์ข ๋ ์ด์ํ๊ณ ์ด์ผ๊น๊ฑฐ๋ฆฌ๊ฐ ์๊ธฐ๋ฉด ๋ ์ฐพ์์ค๊ฒ ์ต๋๋ค. ์์ผ๋ก ์ฐ์ํ๊ณต๋ฐฉ์ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ค๋ ๊ธฐ์ ๋ธ๋ก๊ทธ์ ์ฌ๋ผ์ฌ ์์ ์ด๋ ๋ง์ ๊ด์ฌ ๋ถํ๋๋ฆฝ๋๋ค.