๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 4.0

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ (1.0)ํ‚ค์›Œ๋“œ
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ (2.0)๊ฒฝํ—˜ ์œ„์ฃผ๋กœ
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ (3.0)์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ
(3.1)230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€
(3.2)230313๋ถ€ํ„ฐ ์ข€๋” ๊ฒฝํ—˜, ๊ฐ์ • ์œ„์ฃผ์˜ ๋‚ด์šฉ๋„ ๋‹ด๊ธฐ!
๐ŸŒพ (4.0)ํ•™์Šต ํ‚ค์›Œ๋“œ์—์„œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ณด ์ œ๊ณต, ๊ณ ๋ฏผ์—์„œ ๋‚ด ๊ฒฝํ—˜์„ ์ž์„ธํžˆ ์ ์ž!

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ•™์Šต ํ‚ค์›Œ๋“œ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์™œ ์ž‘์„ฑํ• ๊นŒ?

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์†์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ 3๊ฐ€์ง€ ์ด์œ ๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ด์œ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์‹ค์ œ ํ˜„์—…์—์„œ๋Š” ์‹œ๊ฐ„ ๊ด€๊ณ„ ์ƒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ(TDD)์„ ๋„์ž…ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ํ•œ๋‹ค.(์žฅ๊ธฐ์ ์œผ๋กœ ๋ดค์„ ๋•Œ๋Š”, ํ›จ์”ฌ ๋” ๋“์ด ๋ ํ…Œ๋‹ˆ..!)

์‚ฌ์‹ค ๊ทธ๋™์•ˆ Jest๋ฅผ ํ†ตํ•œ ๊ฐ„๋‹จํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.(์ฃผ๋กœ util ํ•จ์ˆ˜๋“ค) ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๊นŒ?

๋ฆฌ์•กํŠธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

์˜ค๋Š˜์€ ๋ฆฌ์•กํŠธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ–ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ์ฃผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„(์—„๋ฐ€ํžˆ๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„)์— ๋Œ€ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

import { render, screen } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
    render(<App />);
    const linkElement = screen.getByText(/learn react/i);
    expect(linkElement).toBeInTheDocument();
});

test('welcom message2 by queryByText', () => {
  const {getByText, queryByText} = render( <App />);
  expect(queryByText(/welcome/i)).toBeInTheDocument();
});

๋˜ํ•œ, ์–ด๋–ค ํƒœ๊ทธ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ๋ฒŒ์–ด์ง€๋Š” ์ผ์— ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ ํ…Œ์ŠคํŠธ๋„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

import {render, screen, fireEvent} from '@testing-library/react'

it('App.js: button์„ clickํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค', () => {
    const {getByText} = render( <App />);
    fireEvent.click(getByText('loading data'))
    getByText('newdata');
})

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ์ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธํ‹€ ํ•˜๊ณ ์‹ถ์„ ๋• ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

import { render, screen, fireEvent, waitFor } from '@testing-library/react';


it('App.js: button์„ clickํ•˜๋ฉด 1๋ฒˆ API ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค', async () => {
    //given
    // 'https://jsonplaceholder.typicode.com/todos/1' ์š”์ฒญ ํ›„ ์‘๋‹ต ๋ฐ์ดํ„ฐ์˜ title ๊ฐ’์ด๋‹ค.
    const title = "delectus aut autem";

    //when
    const {getByText} = render( <App />);
    fireEvent.click(getByText('loading data'))

    //then
    await waitFor(() => getByText(title));
})

์ข€๋” ์ž์„ธํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์šฉ์€ ์ถ”ํ›„ ๋” ๋ฐฐ์›Œ๋ณด๋ ค ํ•œ๋‹ค.(๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋Š” TDD๋กœ ํ•ด๋ณด๊ธฐ!)

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

์ตœ๊ทผ ์Šฌ๋Ÿผํ”„ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์˜์š•์ด ์กฐ๊ธˆ ๋‚ฎ์•„์กŒ์—ˆ๋Š”๋ฐโ€ฆ! ์˜ค๋Š˜ ๋‹ค์‹œ ํŒํŒ ์ƒ๊ฒผ๋‹ค!!! ๋‚˜๋Š” ์ด ์ผ์ด๋ž‘ ์ž˜ ๋งž๋Š” ํŽธ์ธ๊ฐ€๋ณด๋‹ค!

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

  • ์˜ค๋Š˜ ์—ด์‹ฌํžˆ ๋ชฉํ‘œํ•œ๋งŒํผ ๊ตฌํ˜„ํ•ด๋‚ธ ์ 

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • ์—†์Œ!

์ฐธ๊ณ