230912(ํ)
๐ค ์ฑ์ฅ์ผ์ง 7.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
โ (7.0)<์์ ๊ฐํธ>
ํ์ธ๋ง ํ์ต๋ฒ
์ ์๊ฒ ๋๋งํผ, ์ฑ์ฅ์ผ์ง๋ ์ ๋ง ๊ทธ ๋ ์ ํค์๋ ์ค์ฌ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋๋ก ํ๋ค.
โ๏ธ ํค์๋: ์ง๊ด์ ์ด๊ณ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
ํ ์คํธ ์ฝ๋
- ์ํํธ์จ์ด ํ
์คํธ๋
์ํํธ์จ์ด๊ฐ ์๋ํ๋๋ก ๋์ํ๋์ง๋ฅผ ํ์ธํ๋ ๊ณผ์
์ด๋ค. - ํ
์คํธ ์ฝ๋๋
ํ ์คํธ๋ฅผ ์๋ํํ๊ธฐ ์ํด ์์ฑํ๋ ์ฝ๋
์ด๋ค.(๊ฐ๋ฐ์๋ ํญ์ ๋ญ๋ ์ง ์๋ํํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํ๋ค!!! ํจ์จ์ ์ผ๋ก ์ด์!!!) - ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํจ์ผ๋ก์จ
ํ ์คํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ ์ ์๊ณ , ํ ์คํธ๋ฅผ ์ํํ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
-
- ๋น ๋ฅธ ์ฃผ๊ธฐ๋ก ๋ด ์ฝ๋์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ค.
-
- ์ค์๊ฐ์ผ๋ก ๊ฐ๋ฐ ์ค์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ค.
-
- ์ฆ, ์ฝ๋๋ฅผ ์์ฑํจ์ ์์ด์ ๋ ํ์ ์ ๊ฐ๊ณ ์์ฑํ ์ ์๋ค.
-
- ํ
์คํธ ์ฝ๋ ๋์์ ๊ท๋ชจ์ ๋ฐ๋ผ ๋จ์ ํ
์คํธ, ํตํฉ ํ
์คํธ, E2E ํ
์คํธ๋ก ๋๋ ์ ์๋ค.
-
- ๋จ์ ํ ์คํธ: ํจ์, ๋ชจ๋, ํด๋์ค ๋ฑ์ ๋จ์๋ฅผ ํ ์คํธํ๋ ๊ฒ
-
- ํตํฉ ํ ์คํธ: ๋จ์ ํ ์คํธ๋ฅผ ํตํฉํ๋ ๊ฒ
-
- E2E ํ ์คํธ: ์ฌ์ฉ์์ ๊ด์ ์์ ํ ์คํธํ๋ ๊ฒ
-
์ฌ์ค์ ํ๋ก ํธ์๋ ์ง์์์๋ ๋จ์ ํ ์คํธ๋ฅผ ํจ์ฌ ๋ง์ด ์ ์ฉํ๊ณ , ๋น๊ต์ ๋น์ฉ์ด ํฐ E2E ํ ์คํธ๋ ๊ทธ ๋น๋๊ฐ ๋ ์ ๋ค๊ณ ํ๋ค.
Jest(Javascript Test) ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- JavaScript ์ง์์์ ์ฌ์ฉ๋๋ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.(์ด์ธ์๋ Mocha, Chai, Jasmine ๋ฑ์ด ์๋ค.)
*.test.*
ํํ์ ํ์ผ์ ๋ชจ๋ ํ ์คํธ ์ฝ๋๋ก ์ธ์งํ๋ค.- ์๋์ ๊ฐ์ ํํ๋ฅผ ๋๋ค.
test('ํ
์คํธ ์ค๋ช
', () => {
// ํ
์คํธ๋ฅผ ์ํ ์
์
(๋ณ์ ์ ์ธ, ํจ์ ์ ์ธ ๋ฑ)
expect('ํ
์คํธ ๋์').toBe('๊ธฐ๋ ๊ฒฐ๊ณผ');
});
- ์ด ๋,
toBe()
์ ๊ฐ์ ํจ์๋ฅผmatcher
๋ผ๊ณ ํ๋ค.
React Testing Library(RTL)
- React ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- RTL์ ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ด ์๋๋ผ ๊ฒฐ๊ณผ ์ฆ,
ํ๋ฉด์ ๋ฌด์์ด ๋ ๋๋ง๋๋์ง
์ ์ด์ ์ ๋ง์ถ๋ค.- ์ฐธ๊ณ )
Enzyme
์ ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ ์ด์ ์ ๋ง์ถ๋ค. - ์์) ์ด๋ค state๋ฅผ useState๋ก ๊ด๋ฆฌํ๋ค๊ฐ Recoil๋ก ๊ด๋ฆฌํ๊ฒ ๋์์ ๋,
Enzyme
์ ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค. ๋ฐ๋ฉด์RTL
์ ํ๋ฉด์ ๋ฌด์์ด ๋ ๋๋ง๋๋์ง์ ์ด์ ์ ๋ง์ถ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค.
- ์ฐธ๊ณ )
- ์๋์ ๊ฐ์ ํํ๋ฅผ ๋๋ค.
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom';
import App from './App';
test('App rendering', () => {
render(<App />);
const header = screen.getByText('Hello World');
const button = screen.getByText('Click me!');
userEvent.click(button);
// import '@testing-library/jest-dom'๋ฅผ ํตํด์ dom๊ณผ ๊ด๋ จ๋ matcher ํจ์๋ค์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
expect(header).toBeInTheDocument();
expect(button).toBeDisabled();
});
TDD(Test Driven Development)
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ๋ก, ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๊ทธ์ ๋ง์ถฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
- 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์งํ๋๋ค.
-
- Red: ๋ฌด์กฐ๊ฑด ์คํจํ๋ ํ ์คํธ ์ฝ๋ ์์ฑ(๋น์ฐํ ํจ์๊ฐ ์๋๋ฐ ํ ์คํธ ์ฝ๋๋ง ์์ผ๋๊น!)
-
- Green: ๋ฌด์ํ๊ฒ๋ผ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ์ฝ๋ ์์ฑ
-
- Blue: Green ๋จ๊ณ์ ์ฝ๋๋ฅผ ๋ ์ข์ ํํ๋ก ๋ฆฌํฉํ ๋ง
-
๐ ํ๊ณ
์ค๋์ ํ๋ฃจ์ข
์ผ Recharts์ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ์ฐจํธ์ ์์ด์์ ์ฌ๋ฌ ๊ธฐ๋ฅ๊ณผ props๋ค์ ์ดํด๋ณด๊ณ ์ ์ฉํ๋ค. ์๊ตฌ์ฌํญ์ ํด๋นํ๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํ์ด ๋๋์, ์ค๋ ์ธ์
๋ ๋ค์ ํ
์คํธ ์ฝ๋๋ฅผ ์ด์ฌํ ์ ์ฉํ๋๋ฐ, ์ด๋์ styled-components
๋๋ฌธ์ ์ฝ๊ฐ์ ์๋ฌ๋ค์ด ์์๋ค. ๊ทธ๋๋ ๊ฒฐ๊ตญ์ ThemeProvider๋ฅผ ๊ฐ์ธ์ฃผ๊ณ ํ
์คํธ๋ฅผ ์งํํ๋ ๊ด์ฐฎ์๋ค. ๋ด์ผ์ ๋์๊ฐ์ styled-components์ style์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ๊ณผ ์๊ฐ์ด ๋๋ค๋ฉด cypress๋ฅผ ํตํด์ E2E ํ
์คํธ๋ฅผ ์งํํด๋ณด๋ ค ํ๋ค.