ํ๋ก ํธ์๋ ํ ์คํธ
๐ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธฐ๋ํ ๊ฒฐ๊ณผ๋๋ก ๋์ํ๋์ง ๊ฒ์ฆํ๋ ์ผ๋ จ์ ๋ชจ๋ ํ์
- ๋ชฉํ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ ํฅ์์ด ๋ชฉํ
- ๋ด๋ถ ์ฝ๋์ ๋ค์ํ ์ฐ์ฐ๋ฟ๋ง ์๋๋ผ ํด๋ผ์ด์ธํธ ์์ญ์ ๋ํ ์ฌ์ฉ์์ ์ธํฐ๋ ์ (๋ง์ฐ์ค ํด๋ฆญ, ํค๋ณด๋ ์ ๋ ฅ ๋ฑ)๋ ๊ณ ๋ คํด ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ๊ฒ์ฆ
- DOM ์์๋ค์ด ์ํ๋ ์์น์ ์ง์ ํ ํฌ๊ธฐ๋ ์ฌ๋ฐฑ์ ๊ฐ์ง๊ณ ์ ์ ํ๊ฒ ๋ฐฐ์น๋์ด ์๋์ง ๊ฒ์ฆํด์ผ ํจ
- ์ด ๋ชจ๋ ๊ณผ์ ์ ๊ฐ๋ฐ ๊ณผ์ ๋ถํฐ QA๊น์ง ์๋ํ๋ ํ๊ท ํ ์คํธ๋ฅผ ํตํด ์ง์์ ์ผ๋ก ๊ฒ์ฆ
์ข์ ํ ์คํธ๋?
๋ชจ๋ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ
- ๋ค๋ฅธ ํ ์คํธ์ ๊ฒฐ๊ณผ๋ ์คํ ์ฌ๋ถ์๋ ๋ฌด๊ดํ๊ฒ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ
ํ ์คํธ์ ๊ฒฐ๊ณผ๋ ์ผ๊ด์ฑ์ด ์์ด์ผ ํจ
- ํ ์คํธ๋ ์ธ๋ถ ํ๊ฒฝ์ ์๊ด์์ด ์ผ๊ด์ฑ ์๋ ๊ฒ์ฆ์ ์ํ
- ์ ์ ํ ๋ชจํน์ ํตํด ํ
์คํธ ํ๊ฒฝ OS, ๋คํธ์ํฌ ๋๋ ๋ค๋ฅธ ์์คํ
๊ณผ์ ์ธํฐํ์ด์ค ๋ฑ ์ธ๋ถ ์์กด์ฑ์ ์ต์ํ
- ๋ชจ๋ ๊ฒ์ ๋ํด ๋ชจํนํ ํ์๋ ์์
๋ด๋ถ ๊ตฌํ์ ์ข ์๋ ํ ์คํธ๋ ์ง์
- ๋ด๋ถ ๊ตฌํ์ ์ข ์๋ ํ ์คํธ๋ ๊นจ์ง๊ธฐ ์ฌ์
- ๋ด๋ถ ๊ตฌํ์ ์ข ์๋ ํ ์คํธ ์ฝ๋๋ ์์ฃผ ์์ ๊ตฌํ์ ๋ณ๊ฒฝ์๋ ํ ์คํธ๊ฐ ๊นจ์ง๊ธฐ ์ฝ๊ณ , ์ ์ง ๋ณด์ ๋น์ฉ์ด ๋ง์ด ๋ค์ด๊ฐใ
- ๋ด๋ถ ๊ตฌํ๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ
ํ ์คํธ๋ ๋จ์ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์์ผ ํจ
- ๊ฐ๋ ์ฑ์ด ์ค์
- ํ ์คํธ์ ์ค๋ช ์ ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑํ๊ณ ,ํ๋์ ํ ์คํธ์์ ๋๋ฌด ๋ง์ ํ ์คํธ๋ฅผ ์ํํ์ง ์๋ ๊ฒ์ด ์ข์
- ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค์ ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ ์ฝ๋๊ฐ ๋ณต์กํ๋ค๋ฉด, ๋ณ๋์ ํจ์๋ก ์ถ์ํํ์ฌ ์ฌ์ฉ
์ ์ง ๋ณด์๊ฐ ๊ฐ๋ฅํ ํ ์คํธ๋ฅผ ์์ฑ
- ํ์ ์ด์์ผ๋ก ๋๋ฌด ์์ ๋จ์์ ํ ์คํธ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ทจ์ฝํด ์ ์ง ๋ณด์ ์ด๋ ต๊ฒ ๋ง๋ค๊ฒ ๋จ
- ๋ชจ๋ ๊ฒ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ๋ณด๋ค๋ ํ ์คํธ ํ๋ ค๋ ๋์์ ๋ฌธ๋งฅ ์์์ ์ ์ ํ ๋ฒ์๋ก ๋๋์ด ์์ฑ
TDD(Test Driven Development)
; ํ ์คํธ ์ฃผ๋์ ๊ฐ๋ฐ
๊ฐ๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ๊นจ์ง๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ์ง์์ ์ธ ๋ฆฌํฉํ ๋ฆฌ์ ํตํด ํ ์คํธ๊ฐ ๊ฒ์ฆ๋๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ๋ก
TDD Cycle
- ์ ์
- ์ถ๊ฐํ๋ ค๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑ
- ๋น์ฐํ ํ ์คํธ ์คํจ
- ๋
น์
- ์ฝ๋๋ฅผ ๊ตฌํํ์ฌ ํ ์คํธ๋ฅผ ํต๊ณผ
- ๋ฆฌํฉํ ๋ง
- ์์ฑํ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ดํดํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ ์ค๊ณ๋์๋์ง ํ์ธํด ๋ฆฌํฉํ ๋ง ์ํ
- ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ๋ ์ด๋ฅผ ์๋ ค์ฃผ๋ ํ ์คํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ์์ธ์ ๊ธ๋ฐฉ ์ฐพ์ ํด๊ฒฐ
- ๋ฐ๋ณต
- ๋ชจ๋ ๊ตฌํ์ด ์๋ฃ๋ ๋๊น์ง ๊ณผ์ ๋ฐ๋ณต
ํ ์คํธ์ ์ ํ
์ ์ (Static) ํ ์คํธ, ๋จ์(Unit) ํ ์คํธ, ํตํฉ(Integration) ํ ์คํธ, E2E(End to End) ํ ์คํธ
Static Test ; ์ฝ๋๋ฅผ ์คํ์ํค์ง ์๊ณ ํ ์คํธ๋ฅผ ํ๋ ๊ฒ
- Type ์๋ฌ๋ Reference ์๋ฌ์ ๊ฐ์ ๊ฐ๋ฐ์์ ์ค์๋ก ์ธํด ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์ง
- ๋ง์ ๊ฐ๋ฐ์์ ๋ ธํ์ฐ์ ์ํด ๋ง๋ค์ด์ง ๊ท์น์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ๋ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ์ต๊ด์ ๊ธฐ๋ฅด๋๋ก ๋์์ค
- ํ๋ก ํธ์๋์ ๊ฒฝ์ฐ ESLint ๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉํ์ง ์๋ ๋ณ์๋ฅผ ์ฐพ๊ฑฐ๋ Typescript ๋ก ํจ์์ ์ธ์๋ก ๋ฐ๋ ํ๋ผ๋ฏธํฐ์ ํ์ ๊ฒ์ฌ๋ฅผ ํ๋ ๊ฒ์ด ์ ์ ํ ์คํธ์ ํฌํจ
Unit Test ; ๋จ์ ํ ์คํธ๋ ๊ฐ ๋ชจ๋์ ๋จ๋ ์คํ ํ๊ฒฝ์์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ
- ์์กด์ฑ์ด ์๋ ์ฝ๋์ ํจ๊ป ํ ์คํธํ๋ Sociable ํ ์คํธ & ๋ชจ๋์ ์ํด ์คํ๋๋ ์ฝ๋๋ฅผ ํ ์คํธ ๋๋ธ๋ก ๋์ฒดํ๋ Solitary ํ ์คํธ
- ex) ํ๋ก ํธ์๋์์ ๋จ์ ํ
์คํธ๋ ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด์ ๊นจ์ง์ง ์๋์ง ํ์ธํ๋ ๊ฒ
- Sociable ํ ์คํธ๋ ์์(child) ์ปดํฌ๋ํธ๊น์ง ํฌํจํด์ ๋ ๋๋งํ๋ ๊ฒ
- Solitary ํ ์คํธ๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจํนํด์ ๋ ๋๋ง ํ๋ ๊ฒ
Integration test ; ๋ ๊ฐ ์ด์์ ๋ชจ๋์ด ์ค์ ๋ก ์ฐ๊ฒฐ๋ ์ํ๋ฅผ ํ ์คํธํ๋ ๊ฒ
- ๋ชจ๋ ๊ฐ์ ์ฐ๊ฒฐ์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ, ๋จ์ํ ์คํธ๋ณด๋ค ๋น๊ต์ ๋์ ๋ฒ์์์ ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ๋ฆฌํฉํ ๋ง์ ์ฝ๊ฒ ๊นจ์ง์ง ์๋ ์ฅ์
- ํ
์คํธ ๋๋ธ์ ์ฌ์ฉ ์ฌ๋ถ์ ๋ฐ๋ผ broad test์ narrow test๋ก ๊ตฌ๋ถ
- broad test๋ ์์กด์ฑ์ด ์๋ ๋ชจ๋ ๋ชจ๋์ด ์ฐ๊ฒฐ๋ ์ํ๋ฅผ ํ ์คํธํ๋ ๊ฒ
- narrow test๋ ์ฐ๊ฒฐ๋ ๋ชจ๋์ ํ ์คํธ ๋๋ธ๋ก ๋์ฒดํ์ฌ ํ ์คํธํ๋ ๊ฒ
- ex) ํ๋ก ํธ์๋์์ ํตํฉ ํ
์คํธ๋ UI์ API ๊ฐ์ ์ํธ์์ฉ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ผ์ด๋๋์ง, ๋๋ state์ ๋ฐ๋ฅธ UI์ ๋ณ๊ฒฝ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง๋ฅผ ํ์ธํ๋ ๊ฒ
- ์ค์ API๋ฅผ ํธ์ถํ์ฌ broad test๋ฅผ ํ๊ฑฐ๋ API client๋ฅผ ๋ชจํน(mocking) ํ๊ฑฐ๋ ๊ฐ์ API ์๋ฒ๋ฅผ ์ด์ฉํจ์ผ๋ก์จ narrow test๋ฅผ ์ํ
E2E Test ; ์ค์ ์ฌ์ฉ์์ ์ ์ฅ ๋ฐ ํ๊ฒฝ์์ ํ ์คํธํ๋ ๊ฒ
- ํ๋ก ํธ์๋์์ E2E ํ ์คํธ๋ ์ค์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํด์ ํ ์คํธํ๋ ๊ฒ
- ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋๊ณ ์ค์ ์ํฉ์์ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ฅผ ๊ฒ์ถํ ์ ์๋จ ์ฅ์
- ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ฐ๊ธฐ ๋๋ฌธ์ Web API๋ฅผ ํ์ฉํ ์ ์๊ณ ํ ์คํธ ์ฝ๋๊ฐ ๋ด๋ถ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๋ณ๊ฒฝ์๋ ๋น๊ต์ ์ ๊นจ์ง์ง ์๋ ์ฅ์
- ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ฐ๊ธฐ ๋๋ฌธ์ ๋จ์, ํตํฉ ํ ์คํธ๋ณด๋ค ์คํ ์๋๊ฐ ๋๋ฆผ
- ํ ์คํธ์ ์คํ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค(๋คํธ์ํฌ ์๋ฌ ๋ฑ)๋ก ์ธํด ํ ์คํธ๊ฐ ์คํจํ ์ ์์ด์ E2E ํ ์คํธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ขฐํ๊ธฐ ์ด๋ ค์
ํ ์คํธ ๋์
์๊ฐ์ ์์, ์ฌ์ฉ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ, API ํต์
์๊ฐ์ ์์
- ์ค๋
์ท ํ
์คํธ
- HTML ๊ตฌ์กฐ๊ฐ ์๋ํ ๋๋ก ๋ํ๋๋์ง๋ฅผ ํ ์คํธ
- Jest
- ์๊ฐ์ ํ๊ท ํ
์คํธ(Visual Regression Test)
- HTML์ CSS๋ฅผ ๋ํด ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง ๋๋ ๋ชจ์ต์ด ์๋ํ ๋๋ก ๋ํ๋๋์ง๋ฅผ ํ ์คํธ
- Storybook์์ ๋ง๋ Chromatic
์ฌ์ฉ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ์๋ฐ์คํฌ๋ฆฝํธ API ๋๋ React์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํ
์คํธ ์ ํธ๋ฆฌํฐ๋ฅผ ํ์ฉ or E2E ํ
์คํธ๋ฅผ ํตํด์ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์
- ์ฌ์ฉ์์ ๋ง์ฐ์ค, ํค๋ณด๋ ๋ฑ์ ์ ๋ ฅ ์ด๋ฒคํธ๋ฅผ ์ ์ ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ฒ๋ฆฌํ๋ ์์ ํ ์คํธ
- Node.js ํ๊ฒฝ์์ ํ
์คํธ
- React ํ์ด ๊ถ์ฅํ๋ ํ ์คํธ ๋๊ตฌ์ธ testing-library์์ ์ ๊ณตํ๋ ํจํค์ง๋ฅผ ํ์ฉ
API ์๋ฒ ํต์
- ์ค์ API ์๋ฒ
- E2E ํ ์คํธ์์ ์ฃผ๋ก ์ฌ์ฉ
- ํ
์คํธ API ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ฑฐ๋ API client๋ฅผ ๋ชจํน
- API client๋ฅผ ๋ชจํนํ๋ฉด API ์์ฒญ์ ๋ํ ์๋ต์ ์ํ๋ ๋๋ก ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์ํฉ์ ํ ์คํธํ ์ ์๋ค๋ ์ฅ์
- Jest๋ฅผ ํ์ฉํ๋ฉด ๋ชจ๋์ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจํนํ ์ ์๊ธฐ ๋๋ฌธ์ testing-library์ ๋ง์ฐฌ๊ฐ์ง๋ก Jest๋ฅผ ํ ์คํธ ๋๊ตฌ๋ก ํ์ฉํ ๊ฒ์ React ํ์์ ๊ถ์ฅ
ํ ์คํธ ํ๊ฒฝ
ํ ์คํธ ์ฝ๋๊ฐ ์ด๋์์ ์คํ๋๋์ง์ ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ๊ณผ Node.js ํ๊ฒฝ์ผ๋ก ๊ตฌ๋ถ
๋ธ๋ผ์ฐ์ ํ๊ฒฝ
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ชจ๋ Web API์ ์ ๊ทผ ๊ฐ๋ฅ
- ์๋ก ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ๊ธฐ๊ธฐ ํธํ์ฑ ํ ์คํธ๋ ์งํ ๊ฐ๋ฅ
- ๋ธ๋ผ์ฐ์ ์ ํ๋ก์ธ์ค๊ฐ Node.js ํ๋ก์ธ์ค๋ณด๋ค ๋ฌด๊ฒ๊ธฐ ๋๋ฌธ์ ์คํ ์๋๊ฐ ๋๋ฆผ
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํด์ผ ํ๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ฐ์ฒ๋ฅผ ๋ณ๋๋ก ์ค์นํด์ผ ํ๋ค๋ ์ ์ฝ
- ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด UI ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ Headless ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉ
- ๊ฐ๋ฐ์ด ์๋ฃ๋์ด ๋ฐฐํฌํ ๋ CI์ ์ฐ๋ํด์ ํ ์คํธํ๋ ๋ฐฉ์์ด ๊ถ์ฅ
Node.js ํ๊ฒฝ
- ๋ผ์ฐ์ ํ๊ฒฝ๋ณด๋ค ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ฅ์
- Node.js ํ๊ฒฝ์ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API, DOM ์ ๊ทผ API๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์กด์ฌ
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด Jest์ ๊ฐ์ ํ ์คํธ ๋๊ตฌ๋ค์ jsdom์ฒ๋ผ DOM์ ๊ฐ์์ผ๋ก ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉ
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง๊ณผ ๊ฐ์ ๋ค์ํ ํ๊ฒฝ์์์ ํ ์คํธ๋ ํ ์ ์์
Trade off
React ๊ณต์ ๋ฌธ์์์๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ๊ณผ Node.js ํ๊ฒฝ์์ ํ ์คํธํ๋ ๊ฒ์ ๋ํ ํธ๋ ์ด๋ ์คํ๊ฐ ์กด์ฌํ๋ค๊ณ ์ค๋ช
TOAST UIํ(์ฐธ๊ณ )
๋ธ๋ผ์ฐ์ ํ๊ฒฝ; ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ๋๋ ๋ ๋๋ง, ๋ด๋น๊ฒ์ด์ ๋ฑ ๋ธ๋ผ์ฐ์ ์ ์ค์ ๋์์ ํ ์คํธ
Node.js ํ๊ฒฝ; ๊ทธ ์ธ์ ๊ฒฝ์ฐ
Testing Tools
๋ธ๋ผ์ฐ์ ํ๊ฒฝ
Testcafe ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง, ํฌ๋ก์ค ํ๋ซํผ ํ๊ฒฝ์์ ํ ์คํธํ๋ ๋ฐ์ ํนํ๋ E2E ํ ์คํธ ๋๊ตฌ
Node.js ํ๊ฒฝ
Jest ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ๋๊ตฌ๋ค์ด ํ ์คํธ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ํ ์คํธ ๋ฌ๋์ ํ ์คํธ์ ํ์ํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ ๊ณต
Testing library UI๋ฅผ ์ฌ์ฉ์ ๊ด์ ์์ ํ ์คํธํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Reference
์ด์ฌ์ฑ ์ , ใ๊ธฐ์ด๋ถํฐ ์์ฑ๊น์ง, ํ๋ฐํธ์๋ใ, ๋น์ ์ดํผ๋ธ๋ฆญ(2021)
๋๊ธ