React Testing Pattern
์ค์ ๊ณผ ํด์ง๋ฅผ ํตํ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌ
์ ๋ํ ์คํธ๋ฅผ ์ํํ ๋ ๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๊ณ ์ธ๋ถ ํ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ํญ์ ๋์ผํ ํ๊ฒฝ์์ ์์ํ ๋ชจ๋์ ๋์๋ง์ ๊ฒ์ฆํด์ผ ํ๋ค.
์ค์ (Setup)
ํ ์คํธ๊ฐ ์์๋๊ธฐ ์ ์ ์ํ๋๋ฉฐ ๋์ผํ ํ๊ฒฝ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ณ์ ์ค์ ๋ฐ mock์ ์ฃผ์ ํ๋ค.
jest์์ ์ ๊ณตํ๋
beforeEachbeforeAll๋ฑ์ ํจ์๋ค์ ์ฌ์ฉํด์ ๋ฏธ๋ฆฌ ์ค์ ํ๊ณ ์ ํ๋ ๊ฐ๋ค์ ์ ์ํ๊ฑฐ๋ ๋ชจํนํ๋ค.beforeAll() โ ๋์ผํ ์ค์ฝํ ๋ด(์์ํฌํจ) ํ ์คํธ๋ค์ด ์์๋๊ธฐ ์ ๊ฐ์ฅ ๋จผ์ ํ๋ฒ ์ํ
beforeEach() โ ๋์ผ ์ค์ฝํ ๋ด(์์ํฌํจ) ๊ฐ๊ฐ์ ํ ์คํธ ํจ์๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ์ํ
ํด์ง(Teardown)
ํ ์คํธ์ ์ข ๋ฃ ํ ๋ง๋ฌด๋ฆฌ, ์ดํ ํ ์คํธ์ ์ํฅ์ด ์๋๋ก ์ธํ
AfterEach() โ ๋์ผ ์ค์ฝํ ๋ด(์์ํฌํจ) ๊ฐ๊ฐ์ ํ ์คํธ ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ ์ํ
AfterAll() โ ๋์ผํ ์ค์ฝํ ๋ด(์์ํฌํจ) ํ ์คํธ๋ค์ด ๋ชจ๋ ์ํ๋ ํ ๋ง์ง๋ง์ ํ๋ฒ ์ํ
parent Scope ๋จผ์ ์ํ๋๊ณ ๊ทธ ๋ค์ child Scope๊ฐ ๋์ค์ ์ํ๋๋ค.
React Testing Library ํจ์ ๋ด๋ถ์์ ์ด๋ฏธ ์ค์ /ํด์ง๋ฅผ ์งํํ๊ณ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ์ค์ ์ ์ฒ๋ฆฌํ์ง ์์๋ ๋์ง๋ง ํ ์คํธ์ ๋ ๋ฆฝ์ ์ํ ๋ณด์ฅ์ ์ํ ๊ฐ๋ ์ ์ดํดํด์ผ ํ๊ณ ๋ณ๋๋ก ์ค์ /ํด์ง๊ฐ ํ์ํ ์ฝ๋๊ฐ ์กด์ฌ
Timer๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
setTimeout, setInterval, clearTimeout, clearInterval
Timer๋ฅผ ์ฌ์ฉํ์ฌ ๋ช์ด ๋ค์ ์ด๋ฒคํธ๋ฅผ ์คํํ๋ ๋ฑ์ ์ฝ๋๋ค์ ํ ์คํธ๊ฐ Timer๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ ์ด๋ก ์ธํด ํ ์คํธ๋ ๋๋ ค์ง๊ณ ์์ธก ๋ถ๊ฐ๋ฅํด์ง๋ค.
์ด๋ฐ ๊ฒฝ์ฐ jest์์ ์ ๊ณตํ๋
fake timer๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
ํ ์คํธ๋ ์ฌ์ฉ์๋ค์ด ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํด์ผํ๋ค.
Queries Accessible to Everyone
๋ชจ๋๊ฐ ์ ๊ทผํ ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค. (ํ๋ฉด์ ๋ณด๊ณ ์๋ ์ฌ์ฉ์๋ , ์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ )
getByRole: ์ ๊ทผ์ฑ ํธ๋ฆฌ์ ๋ ธ์ถ๋ ๋ชจ๋ ์์๋ฅผ ์ฟผ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋จ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ํด๋น ์ต์ ์ด ๊ฐ์ฅ ์ ํธ๋จ,
์ด ์ต์ ์ผ๋ก ์ป์ ์ ์๋ ๊ฒ๋ค์ UI์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ผ ์ ์์
getByLabelText: ํผ ํ๋์ ์ ํฉ, ๋ ์ด๋ธ ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ฐพ์getByPlaceholderText:๋ ์ด๋ธ์ ๋์ฒด ํ ์ ์์ง๋ง, ๋ค๋ฅธ ๋์๋ณด๋ค๋ ๋ซ๋ค.getByText: ํผ ์ธ์ ํ ์คํธ ์ปจํ ์ธ ๋ฅผ ์ฐพ๋ ์ฃผ์ ๋ฐฉ๋ฒ,div,span,p๋น๋ํํ ์์๋ฅผ ์ฐพ๋๋ฐ ์ฌ์ฉ๋จgetByDisplayValue: ํผ ์์์ ํ์ฌ ๊ฐ์ผ๋ก ์์๋ฅผ ์ฐพ๋๋ฐ ์ ์ฉ
Semantic Queries
์๋ฏธ๋ก ์ ์ธ ์ฟผ๋ฆฌ, HTML5 & ARIA ์ ํ๊ธฐ, ํด๋น ์์ฑ๋ค์ ๋ธ๋ผ์ฐ์ ์ ๋ณด์กฐ ๊ธฐ์ (์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ)์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ฏ๋ก ์ผ๊ด์ฑ์ด ์กฐ๊ธ ๋จ์ด์ง, -> ์์ฑ์ด ํ์๋๋ ๋ฐฉ์์ด ์ผ๊ด๋์ง ์๋ค! ์ฌ์ฉ์๋ค์ด ์ํํธ์จ์ด์ ์ํธ์์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ ์คํธ๊ฐ ์งํ๋๊ณ ์๋์ง ์ ์ ์๋ค.
getByAltText: ์์์ ๋์ฒด ํ ์คํธ(์ด๋ฏธ์ง, ์์ญ, ์ ๋ ฅ ๋ฐ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์์)๊ฐ ์ง์๋๋ ์์์ธ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ๊ฐ๋ฅgetByTitle: ์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ์์ ์ผ๊ด๋๊ฒ ์ฝํ์ง ์๊ณ ์๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์๋์ง ์์
Test Ids
์ตํ์ ์๋จ
์ฌ์ฉ์๋ค์ด Test ID์ ์ํธ์์ฉ ํ ์ผ์ ์ ๋ ์๋ค.
getByTestId: ์ฌ์ฉ์ ์ ์ฅ์์ ๋ณด๊ฑฐ๋ ๋ค์ ์ ์๋ ์์๋ก ์ญํ ์ด๋ ํ ์คํธ๋ณ๋ก ์ผ์น์ํฌ ์ ์๊ฑฐ๋ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ(์: ํ ์คํธ๊ฐ ๋์ ์ธ ๊ฒฝ์ฐ)์๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ
์์๋ฅผ ์ฐพ๋๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์์ฃผ๋ ํฌ๋กฌ ์ต์คํ ์
์ธํฐ๋ ์
๋จ์์ ๊ฒ์ฆ
AAA ํจํด (Arrange, Act, Assert)
ํ ์คํธ ์ฝ๋๋ 3๋จ๊ณ๋ก ๋๋์ด ํด๋น ํ ์คํธ๊ฐ ๋ฌด์์ ํ๊ณ ์ด๋ค ๋ชฉ์ ์ ๊ฐ๋์ง ๋ณด๋ค ๋ช ํํ๊ฒ ์ดํดํ ์ ์๋๋ก ๊ตฌ์ฑ
Arrange (์ค๋น)
ํ ์คํธ ์คํ ์ค ํ์ํ ๊ฒ๋ค์ ์ค๋น
BeforeEach,afterEachRender Components
Mocking, State, Service ๋ฑ
Act (์คํ)
ํ ์คํธ ์ฝ๋ ์คํ
User์ Action (Click, State change ๋ฑ)
RTL์ act() wrapping ๋ถํ์
Assert (๋จ์ธ)
์คํํ ์ฝ๋ ๊ฒฐ๊ณผ์ ๋์์ ๊ฒ์ฆ
Text, State, Child count ๋ฑ
๋ณต์กํ ์ปดํฌ๋ํธ๋ผ๋ฉด
์ปดํฌ๋ํธ๊ฐ ๋ณต์กํ๋ค๋ฉด ์ธํฐ๋ ์ ๋จ์ ๊ฒ์ฆ์์ ์ปดํฌ๋ํธ์ ๋ชฉ์ ๊ณผ ๋์์ ๋ง์ถ์ด ํ ์คํธ๋ฅผ ์ปดํฌ๋ํธ๋ณ ๋์๋ณ๋ก ๋ถ๋ฆฌํด์ ์งํ
Ex) List - Item ๊ด๊ณ (Container - Child)
List ์ปดํฌ๋ํธ โ list ์กฐ๊ฑด์ ๋ฐ๋ผ list count๊ฐ ์๋๋์ง ํ์
Item ์ปดํฌ๋ํธ โ child component๋ค์ property, value ๊ฐ์ ๊ฐ์ง๊ณ ์ฌ๋ฐ๋ฅด๊ฒ render ๋๋์ง
ํ
์คํธ ์ ํธ
https://testing-library.com/docs/react-testing-library/setup/
๋ ๋๋ง ๊ฒ์ฆ
Component๋ฅผ Renderํ๊ณ document.body์ ๋ถ์ธ๋ค.
๋ฐํ๊ฐ
query objects โ render ๋ DOM์์ ํน์ element๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ ===
screen์ฌ์ฉcontainer โ React ์ปดํฌ๋ํธ๊ฐ render ๋ DOM node, div
baseElement โ container๊ฐ ๋ค์ด์๋ DOM node, default - body
rerender โ props๋ฅผ ๋ณ๊ฒฝํ์ฌ component update ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
unmount โ ๋ฉ๋ชจ๋ฆฌ ์ ์๋ฅผ ์ ๋ฐํ๋ event handler๋ฅผ ๋จ๊ฒจ๋๋ ํ ์คํธ ์๋ ์ ์ ์ฉ, ๋๋ ์ปดํฌ๋ํธ๊ฐ unmount ๋๋ ์์ ์ ํ ์คํธํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
RenderHook
ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ Hook์ ํ ์คํธํ๋ ํจ์
React v18 ๋ถํฐ RTL/react์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด์ง
๋ฆฌ์ํธ ๋ ๋๋ง ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ฅด๋ ๋จ์ํ ํจ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ์ ์ธ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ ํฉํจ
renderHook ํจ์ ์์ ์ฝ๋ฐฑ์ผ๋ก hook์ ๋ฃ๊ณ ํ ์คํธ
return object์ reulst ์์ฑ์ ํตํด ํ ์ ๋ฐํ๊ฐ์ ํ์ธํ ์ ์๋ค.
result.currentโ ์ฝ๋ฐฑํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฆฌํดํ ๊ฐcurrentโ ์ปค์คํ ํ ์ ์ฌ๋ฌ๋ฒ ํธ์ถ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ์คํ๊ฐ์ธ current๋ฅผ ์ฐธ์กฐ
act()
์ํธ ์์ฉ(๋ ๋๋ง, ์ดํํธ ๋ฑ)์ ํจ๊ป ๊ทธ๋ฃนํํ๊ณ ์คํํด ๋ ๋๋ง๊ณผ ์ ๋ฐ์ดํธ๊ฐ ์ค์ ์ฑ์ด ๋์ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์
ํ ์คํธ ํ๊ฒฝ์์
act()๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์๋(jsdom)์ ์ ๋ฐ๋ก ๋ฐ์๋์๋ค๋ ๊ฐ์ ํ์ ํ ์คํธ ๊ฐ๋ฅํด์ง์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ค ์ ๋ฐ์ดํธ ํ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
ํ ์คํธ ํ๊ฒฝ์์ ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ jsdom์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์ฌ์ฉํด์ผํจ
RTL์ Render, UserEvent API๋ ๋ด๋ถ์ ์ผ๋ก act()๋ฅผ ํธ์ถํ์ฌ ์ํ๋ฅผ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์
Context API ๊ฒ์ฆ
custom hook์ด context API ๋๋ redux์ dispatch๊ฐ์ context๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
renderHook์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก contextProvider Wrapper๋ฅผ ์ ๊ณต
Asyc ๊ฒ์ฆ
custom hook์ด async ๋์์ ์ํํ ๋
Last updated