4.Testing Library

Jest

  • ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ํ…Œ์ŠคํŒ… ๋„๊ตฌ์ด๋‹ค.

  • ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ตœ์ดˆ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋งŽ์€ ์„ค์ •์„ ์š”๊ตฌํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.(zero config)

Describe-Context-It ํŒจํ„ด

ํ‚ค์›Œ๋“œ์„ค๋ช…

Describe

ํ…Œ์ŠคํŠธ ์ค‘์ธ ๊ธฐ๋Šฅ ๋˜๋Š” ๊ธฐ๋Šฅ์˜ ์ „๋ฐ˜์ ์ธ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์ด ํฌํ•จ๋˜๋ฉฐ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์ „์ œ ์กฐ๊ฑด์ด๋‚˜ ๊ฐ€์ •๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

Context

๊ธฐ๋Šฅ์ด ํ…Œ์ŠคํŠธ๋˜๋Š” ํŠน์ • ์ปจํ…์ŠคํŠธ ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ํŠน์ • ์ž…๋ ฅ, ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒํƒœ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

It

์ˆ˜ํ–‰ ์ค‘์ธ ํŠน์ • ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€ ๋˜๋Š” ์ฃผ์žฅ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ธ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ธฐ๋Šฅ์˜ ์˜ˆ์ƒ ์ถœ๋ ฅ์ด๋‚˜ ๋™์ž‘์ด ํฌํ•จ๋œ๋‹ค.

์žฅ์ 

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

  • "๋น ๋œจ๋ฆฐ" ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๋‹ค.

describe('add ํ•จ์ˆ˜๋Š”', () => {
  it('๋‘ ์ˆซ์ž์˜ ํ•ฉ์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.', () => {
    expect(add(1, 2)).toBe(3);
  });
});

Describe-Context-It ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ๋ชจ์Œ์„ ๋” ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠน์ • ๋ฌธ์ œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ๋ชจ์Œ์ด ํฌ๊ด„์ ์ด๊ณ  ๋ชจ๋“  ๊ด€๋ จ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ๋™์ž‘์„ ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

React Testing Library

React Testing Library๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ DOM์„ ์ฟผ๋ฆฌํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” DOM ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์— ๊ตฌ์ถ•๋œ๋‹ค.

React Testing Library๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์— ์ดˆ์ ์„ ๋งž์ถ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ์ฆ‰, ํŠน์ • ์š”์†Œ๋‚˜ ์Šคํƒ€์ผ์˜ ์กด์žฌ์™€ ๊ฐ™์€ ํŠน์ • ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ํ•ด๋‹น ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

React Testing Library๋Š” DOM์„ ์ฟผ๋ฆฌํ•˜๊ณ  render, fireEvent ๋ฐ waitFor์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ถ” ํด๋ฆญ ๋˜๋Š” ์–‘์‹์— ํ…์ŠคํŠธ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

React Testing Library๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ React ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์‹œ์— ๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์ ์ธ ํ…Œ์ŠคํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์— ์ดˆ์ ์„ ๋งž์ถค์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋” ํƒ„๋ ฅ์ ์ด๊ณ  ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์™€ ๊ธฐ๋Œ€์— ๋” ์ž˜ ๋ถ€ํ•ฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

The more your tests resemble the way your software is used, the more confidence they can give you. - RTL ๊ณต์‹๋ฌธ์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์šฉ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ• ์ˆ˜๋ก ๋” ๋งŽ์€ ์‹ ๋ขฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

React Testing Library๋Š” UI์— ํŠนํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

RTL์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ์ ์œผ๋กœ CRA์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ๋งŒ์•ฝ CRA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ง์ ‘ ์„ค์ •ํ•œ๋‹ค๋ฉด npm install --save-dev @testing-library/react ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

test('Greeting', () => {
 render(<Greeting name='world' />);

 const text = screen.getByText(/Hello, world/);
 expect(text).toBeInTheDocument();
});

์ฟผ๋ฆฌ ํƒ€์ž…

  • get - ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ ์—๋Ÿฌ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  • find - ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ ์—๋Ÿฌ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  • query - ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Action, Assertion, ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ๋“ฑ๋“ฑ ์ด ๋ถ€๋ถ„๋„ ์•ž์œผ๋กœ ๊ฐ•์˜๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ๋ฌด๋ถ„๋ณ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋ณด๋‹ค ์ •๋ง ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ํ…Œ์ŠคํŠธ๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ๊ณ ๋ฏผํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•ด ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

Aha Moment

Chat GPT๋ฅผ ์ด์šฉํ•ด์„œ 1์ฃผ์ฐจ ๋นˆ์•ฝํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€๋กœ ์ •๋ฆฌํ•ด ์ฃผ์—ˆ๋Š”๋ฐ React Testing Library๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๋‚˜๋‹ˆ๊น Test ๊ฐ•์˜๊ฐ€ ๋” ๊ธฐ๋Œ€๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์‚ฌ์‹ค ํ˜„์žฌ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค์—๋Š” test ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ์ฝ”๋“œ ์•ˆ์ •์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์—†๊ณ  ์ด์ „์— ์†Œ์…œ๋กœ๊ทธ์ธ ๊ด€๋ จํ•ด์„œ ์ถ”๊ฐ€์ ์ธ ์ˆ˜์ • ์ž‘์—…์„ ํ†ตํ•ด์„œ ์†Œ์…œ๋กœ ์ด๋ฏธ ๊ฐ€์ž…๋˜์–ด์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ์€ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰์ด ๋˜์—ˆ์ง€๋งŒ ํšŒ์›๊ฐ€์ž…์ด ์ง„ํ–‰์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋˜ ์ƒํ™ฉ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์€ ๋“ค์—ˆ์ง€๋งŒ ์ ์šฉ๊นŒ์ง€๋Š” ์‰ฝ์ง€ ์•Š์€ ์ƒํ™ฉ์ด์–ด์„œ ์ดํ›„์— ์žˆ์„ ํ…Œ์ŠคํŠธ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด์„œ ์–ด๋Š์ •๋„ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ž‘์€ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ ์šฉํ•ด ๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

Last updated