Test Tip

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ˆ์ปท

  • vscode >Keyboard Shorcuts > test.run > run test in current file or run test at cursor

VSCode Extension

์˜ฌ๋ฐ”๋ฅธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๋ฒ•

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

  • ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ฐ•ํ•œ ์˜์กด์„ฑ ๋•Œ๋ฌธ์— ๊นจ์ง€๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์บก์Аํ™”์— ์œ„๋ฐ˜๋˜์ง€ ์•Š์œผ๋ฉฐ ์ข…์†์„ฑ์ด ์—†๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ž

100% ์ปค๋ฒ„๋ฆฌ์ง€๋ณด๋‹ค๋Š” ์˜๋ฏธ ์žˆ๋Š” ํ…Œ์ŠคํŠธ์ธ์ง€ ๊ณ ๋ฏผ

  • ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ซ“๋‹ค๋ณด๋ฉด ํฐ ์œ ์ง€ ๋ณด์ˆ˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ œ๋ฐ๋กœ ๋œ ๊ฒ€์ฆ์ด ๋˜์—ˆ๋‹ค๋Š” ์ฐฉ๊ฐ์ด ๋“ค์ˆ˜ ์žˆ๋‹ค.

  • ์˜๋ฏธ์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž

๊ฐ€๋…์„ฑ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•

1. ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆ ์ž‘์„ฑํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ ๋””์Šคํฌ๋ฆฝ์…˜์„ ์ƒ์„ธํžˆ ๋ช…ํ™•ํžˆ ์ž‘์„ฑํ•˜๋Š”๊ฒƒ์ด ์•ฑ์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€๋œ๋‹ค.

// ๊ฒ€์ฆ ๋Œ€์ƒ - ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒดํฌ๋œ ํ•ญ๋ชฉ๋“ค ์ œ์™ธ

// BAD
it('๋ฆฌ์ŠคํŠธ์—์„œ ํ•ญ๋ชฉ์ด ์ œ๋ฐ๋กœ ์‚ญ์ œ๋œ๋‹ค.', () => {})

// GOOD
it('ํ•ญ๋ชฉ๋“ค์„ ์ฒดํฌํ•œ ํ›„ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒดํฌ๋œ ํ•ญ๋ชฉ๋“ค์ด ์‚ญ์ œ๋œ๋‹ค.', () => {})

2. ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—๋Š” ๊ฐ€๊ธ‰์  ํ•˜๋‚˜์˜ ๋™์ž‘๋งŒ ๊ฒ€์ฆํ•˜์ž

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋„ ๊ฒ€์ฆ ๋ฒ”์œ„์˜ ์ฑ…์ž„์„ ๋‚˜๋ˆ„๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

  • ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ƒ๊ด€์—†์ง€๋งŒ, ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์กฐํ•ฉ๋˜์—ˆ์„ ๋•Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—์„œ ํ•œ๋ฒˆ์— ๊ฒ€์ฆํ•˜๋Š”๊ฒƒ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’๋‹ค.

  • ๊ฒ€์ฆ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„์ง€๊ณ  ๋””์Šคํฌ๋ฆฝ์…˜๋„ ์žฅํ™ฉํ•ด์ง„๋‹ค.

  • ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฒ€์ฆํ•˜๋‹ค ๋ณด๋‹ˆ ํŠน์ • ๋กœ์ง์ด ์ˆ˜์ •๋˜์–ด๋„ ํ…Œ์ŠคํŠธ ์ž์ฒด๊ฐ€ ๊นจ์ง€๊ฒŒ ๋œ๋‹ค.

  • ์–ด๋–ค ๋™์ž‘์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฒ€์ฆ์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.

// BAD
it('์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋‹ด๊ธด ์ƒํ’ˆ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋…ธ์ถœ๋˜๊ณ , ์ˆ˜๋Ÿ‰์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฐ€๊ฒฉ์ด ์žฌ๊ณ„์‚ฐ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ƒํ’ˆ์ด ์‚ญ์ œ๋œ๋‹ค.', 
  () => {}
 )
 
 // GOOD
it('์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ƒํ’ˆ๋“ค์„ ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•œ๋‹ค.', () => {})
it('์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์„ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐ€๊ฒฉ์ด ์žฌ๊ณ„์‚ฐ ๋œ๋‹ค.', () => {})
it('์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ํ•ญ๋ชฉ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ๋œ๋‹ค', () => {})

๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP, Single Responsibility Principle)

  • ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ–๊ณ , ๊ทธ์™€ ๊ด€๋ จ๋œ ์ฑ…์ž„์„ ์บก์Аํ™”ํ•˜์—ฌ ๋ณ€๊ฒฝ์— ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์ข‹์€ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ

ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๊ณ , ํ…Œ์ŠคํŠธ ์ „ํ›„์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ๋“ค(Before**, After**)์ด ์žˆ๋‹ค.

beforeAll(() => {})
beforeEach(() => {})
afterEach(() => {})
afterAll(() => {})

it('...', () => {
  // Arrange, Given
  const productService = new ProductService(new StubProductService());
  
  // Act, When
  const items = await productService.fetchAvailableItems();
  
  // Assert, Then
  expect(items.length)toBe(1);
  expect(items).toEqual([{ item: 'A', available: true }])
})

์ค€๋น„ (Arrange, Given)

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ object๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ณผ์ •

  • ์ค€๋น„ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ์ค€๋น„๊ณผ์ •์„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ŠคํŠธ์— ๊ฑธ์ณ์„œ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉ

์‹คํ–‰ (Act, When)

ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰

  • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์˜๋„์ ์œผ๋กœ ์‹คํŒจํ•ด๋ณด๊ธฐ

  • expect์— ๋‹ค๋ฅธ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๋“ ์ง€, ์‹คํŒจํ•˜๋„๋ก ๋งŒ๋“  ๋’ค์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํŒจํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ

  • ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๋งŒ๋“  ํ›„, ๋ฒ„๊ทธ๊ฐ€ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๊ตฌ๋‚˜๋ฅผ ๊ฒ€์ฆํ•œ ๋‹ค์Œ์— ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

    • ์‹คํŒจํ•˜์ง€ ์•Š๋Š” ํ…Œ์ŠคํŠธ๋Š” ํ•„์š” ์—†๋‹ค.

    • ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์˜๋„์ ์œผ๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ฒ€์ฆ (Assert, Then)

์‹คํ–‰ํ•œ ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ๊ฐ’๊ณผ ๊ฐ™์€์ง€ ๊ฒ€์ฆ

  • ๋‚ด๊ฐ€ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๊ฒ€์‚ฌํ•˜๋Š”๊ฒƒ์ด ๋งŽ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ• ์ˆ˜ ์—†๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.

์ข‹์€ ํ…Œ์ŠคํŠธ ์›์น™

First ์›์น™

  • Fast: ๋А๋ฆฐ๊ฒƒ์— ๋Œ€ํ•œ ์˜์กด์„ฑ ๋‚ฎ์ถ”๊ธฐ,

    • ํ…Œ์ŠคํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ์ง€ ๋ช‡๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๋นˆ๋ฒˆํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š”๊ฒƒ์ด ์ค‘์š”

  • Isolated: ์ตœ์†Œํ•œ์˜ ์œ ๋‹›์œผ๋กœ ๊ฒ€์ฆํ•˜๊ธฐ, ๋…๋ฆฝ์ ์ด๊ณ  ์ง‘์ค‘์ ์œผ๋กœ ์œ ์ง€

    • ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—์„œ ๋„ˆ๋ฌด ๋งŽ์€๊ฒƒ์„ ๋™์‹œ์— ํ…Œ์ŠคํŠธํ•ด์„œ ์–ด๋””์„œ ์–ด๋–ค๊ฒƒ์ด ์ž˜๋ชป๋˜์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜์ง€ ๋ง๊ณ  ์ตœ์†Œํ•œ์˜ ๋‹จ์œ„๋กœ ์–ด๋””์„œ ์‹คํŒจํ–ˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ

  • Repeatable: ๋ฐ˜๋ณต์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด๋ผ, ํ…Œ์ŠคํŠธ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฒฐ๊ณผ ์œ ์ง€

    • ์–ธ์ œ, ๋ช‡๋ฒˆ ์‹คํ–‰ํ•˜๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๋‚˜์œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

    • ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€์  ํ™˜๊ฒฝ(๋„คํŠธ์›Œํฌ, ๋””๋น„)์— ์˜์กดํ•˜๋Š” ํ…Œ์ŠคํŠธ๋Š” ๋ถˆ์•ˆ์ •

    • ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก.. ์ž‘์„ฑ

  • Self-Validating: Assert library(expect, tobe ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค์Šค๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

    • ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต

    • ์ž๋™ํ™”๋ฅผ ํ†ตํ•œ ๊ฒ€์ฆ๋‹จ๊ณ„ ๋„์ž…(CI/CD)

      • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ถˆํ•„์š”

  • Timely: ์‹œ๊ธฐ์ ์ ˆํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

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

    • ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ, ๋ฆฌํŒฉํ† ๋ง ์ „, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ์‹œ๊ธฐ์ ์ ˆํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•ด์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์žก์•„๋‚ด๋Š”๊ฒƒ์ด ์ค‘์š”

์ข‹์€ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„

Right-BICEP, ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ

  • Boundary conditions: ๋ชจ๋“  ์ฝ”๋„ˆ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ

    • ex: ์ž˜๋ชป๋œ ํฌ๋งท์˜ ์ธํ’‹, null, ํŠน์ˆ˜๋ฌธ์ž, ์ž˜๋ชป๋œ ์ด๋ฉ”์ผ, ์ž‘์€ ์ˆซ์ž, ์ค‘๋ณต, ์ˆœ์„œ๊ฐ€ ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • Inverse relationship: ์—ญ๊ด€๊ณ„๋ฅผ ์ ์šฉํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ํ™•์ธ

    • ์ผ๊ด€์„ฑ์„ ์œ ์ง€ (๋ง์…ˆ -> ๋บผ์…ˆ, ์ถ”๊ฐ€ -> ์ œ๊ฑฐ)

  • Cross-check: ๋‹ค๋ฅธ ์ˆ˜๋‹จ์„ ์ด์šฉํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์ด ๋งž๋Š”์ง€ ํ™•์ธ

    • ex: ์ถ”๊ฐ€๋œ ๊ณผ์ผ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธ ํ•œ๋‹ค๋ฉด, ๊ฒฐ๊ณผ๊ฐ’์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๊ณผ์ผ ๊ฐฏ์ˆ˜ - ์˜ˆ์ „ ๊ณผ์ผ ๊ฐฏ์ˆ˜ ๊ฐ’๊ณผ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค

    • ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋˜‘๊ฐ™์•„์•ผ ํ•œ๋‹ค.

  • Error conditions: ๋ถˆํ–‰ํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ํ•˜๋Š”๊ฐ€?

    • ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘์ง€ ๋“ฑ

    • ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์—๋Ÿฌ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€

  • Performance chracteristic: ์„ฑ๋Šฅ ํ™•์ธ์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ •ํ™•ํ•œ ์ˆ˜์น˜๋กœ ํ™•์ธ

    • ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ์ฒ™๋„์™€ ํ™•์ธ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํ™•์ธ

์ข‹์€ ํ…Œ์ŠคํŠธ ์กฐ๊ฑด

ํ…Œ์ŠคํŠธ๋„ ๊ฐ๊ฐ ์ƒํ™ฉ ๋ฐ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ’์„ ์˜ˆ์ƒํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ฒƒ์ด ์ค‘์š” -> CORRECT ์›์น™

๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ์‚ฌ์‹ค์— ์˜๊ฑฐํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ๊ฑด๋“ค์„ ํ…Œ์ŠคํŠธํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๊ผผ๊ผผํžˆ ์ž‘์„ฑ

CORRECT ์›์น™์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒ ์ด์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋„ ์œ ๋…

  • Conformance: ํŠน์ • ํฌ๋งท์„ ์ค€์ˆ˜

    • ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ, ์•„์ด๋””, ํŒŒ์ผ ํ™•์žฅ์ž ๋“ฑ

    • ์ธํ’‹์ด ํฌ๋งท์— ์ ํ•ฉํ•  ๋•Œ, ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๋•Œ, ์šฐ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์˜ˆ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

  • Ordering: ์ˆœ์„œ ์กฐ๊ฑด ํ™•์ธํ•˜๊ธฐ

    • ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐฐ์—ด์˜ ์ˆœ์„œ๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์ฝ”๋“œ๋ผ๋ฉด, ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ• ๊ฒƒ์ธ์ง€ ์˜ˆ์ƒํ•˜๋Š”๊ฒƒ๋“ค๋„ ๋ชจ๋‘ ํ…Œ์ŠคํŠธ๋กœ ๋‚˜ํƒ€๋‚ด์•ผํ•จ

  • Range: ์ˆซ์ž์˜ ๋ฒ”์œ„

    • ์ œํ•œ๋œ ๋ฒ”์œ„๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๊ฒฝ์šฐ

  • Reference: ์™ธ๋ถ€ ์˜์กด์„ฑ ์œ ๋ฌด, ํŠน์ •ํ•œ ์กฐ๊ฑด์˜ ์œ ๋ฌด

    • ~์ผ๋•Œ, ~๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, ์–ด๋–ค ํŠน์ •ํ•œ ์ƒํ™ฉ/์ƒํƒœ ์ผ๊ฒฝ์šฐ ์ด๋Ÿฐ ๋™์ž‘์„ ํ•œ๋‹ค.

  • Existence: ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋™์ž‘?

    • null, undefined, 0, ''

  • Cardinality: 0-1-N ๋ฒ•์น™์— ๋”ฐ๋ผ ๊ฒ€์ฆ

    • ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ, ํ•˜๋‚˜๋งŒ ์žˆ์„ ๋•Œ, ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๋•Œ

  • Time: ์ƒ๋Œ€, ์ ˆ๋Œ€, ๋™์‹œ์— ์ผ๋“ค

    • ์ˆœ์„œ๊ฐ€ ๋งž์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์†Œ๋น„ํ•œ ์‹œ๊ฐ„, ์ง€์—ญ ์‹œ๊ฐ„

    • ์ˆœ์„œ๊ฐ€ ๋งž์ง€ ์•Š์„ ๋•Œ, ํŠน์ • ์‹œ๊ฐ„์„ ์ง€๋‚˜์น˜๊ฒŒ ์†Œ๋น„ํ–ˆ์„ ๋•Œ, ์‹œ๊ฐ„์„ ๊ฒ€์‚ฌํ•œ๋‹ค๋ฉด ์ง€์—ญ๋งˆ๋‹ค ๋‚˜๋ผ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ

๋ฌด์—‡์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•˜๋‚˜?

  • itteration speed vs Realistic envirionment

    • itteration speed: ํŠน์ •ํ•œ ์ผ์„ ์‹œ์ž‘ํ•ด์„œ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์†๋„

      • ์ฆ‰, ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ›„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ํ•œ๋ฐ”ํ€ด ๋Œ์•„์˜ค๋Š” ์†๋„

      • ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๊ธฐ์กด ํ…Œ์ŠคํŠธ๋ฅผ ๋™์ž‘ํ•ด์„œ ๊ฒฐ๊ณผ ํ™•์ธํ•ด์„œ ์™„์„ฑํ•˜๋Š” ํ•œ๋ฐ”ํ€ด๋ฅผ iteration์ด๋ผ ํ•œ๋‹ค.

      • ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋™์ž‘ํ•˜๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉด ๋น ๋ฅผ ์ˆ˜๋ก iteration speed๋Š” ๋น ๋ฅด๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • Realistic envirionment: ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์•ฑ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ํ™˜๊ฒฝ๊ณผ ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์šด๊ฒƒ

"ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” itteration speed์™€ Realistic envirionment์ด๋ผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ ˆ์ถฉ์ ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค: ์ผ๋ถ€ ๋„๊ตฌ๋Š” ๋ณ€๊ฒฝ ํ›„ ๊ฒฐ๊ณผ ํ™•์ธ๊นŒ์ง€ ๋งค์šฐ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„๊ตฌ๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐ˜๋ณต ์†๋„๊ฐ€ ๋А๋ฆฌ๊ณ  CI ์„œ๋ฒ„์—์„œ ๋” ์ทจ์•ฝ(flaky) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"

  • How much to Mock

    • ์–ผ๋งˆ๋งŒํผ Mock์„ ํ• ๊ฒƒ์ธ๊ฐ€

    • ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ ์œ ๋‹›์ธ์ง€ ํ†ตํ•ฉ์ธ์ง€ ๊ฒฝ๊ณ„๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•˜๋‹ค.

    • ์–ด๋””๊นŒ์ง€ ์œ ๋‹›ํ…Œ์ŠคํŠธ๋กœ ๋ถ€๋ฅด๊ณ , ์–ด๋””๊นŒ์ง€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋กœ ๋ถ€๋ฅผ๊ฒƒ์ธ์ง€๋Š” ์‚ฌ์‹ค ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.

      • util, api, ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ใ…‡ใ…‡

"์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ '๋‹จ์œ„' ํ…Œ์ŠคํŠธ์™€ 'ํ†ตํ•ฉ' ํ…Œ์ŠคํŠธ์˜ ๊ตฌ๋ถ„์ด ๋ชจํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํผ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ…Œ์ŠคํŠธ์—์„œ ํผ ๋‚ด๋ถ€์˜ ๋ฒ„ํŠผ๋„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์— ์ž์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ• ๊นŒ์š”? ๋ฒ„ํŠผ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด ์–‘์‹ ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํŒ€๊ณผ ์ œํ’ˆ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋‹ต์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

React Testing Library

  • ์กฐ๊ธˆ ๋” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ํ…Œ์ŠคํŠธ ์ž์ฒด๋งŒ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’ํ˜€์คŒ

  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚ด๋ถ€ ๊ตฌํ˜„์‚ฌํ•ญ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์คŒ

    • ๋ฆฌ์—‘ํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค CSS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ตฌํ˜„์‚ฌํ•ญ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์ƒ์—, ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ 'ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ๊ฐ–๋Š” ๋ฒ„ํŠผ์„ ๊ฐ€์ ธ์™€์„œ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๋Š”์ง€ ์•ˆ๋ณด์ด๋Š”์ง€' ์กฐ๊ธˆ ๋” ์™ธ๋ถ€์ ์ธ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ

    • ์ด๋Ÿฐ ์ ‘๊ทผ๋ฒ•์€ ๋ฆฌํŒฉํ† ๋ง์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์›น ์ ‘๊ทผ์„ฑ๊ณผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ข‹์€ ์›์น™์„ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ

    • ๊ฒ€์ฆํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ด€๊ณ„์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ๋ง์ž

  • ๋‹จ์ ์œผ๋กœ RTL ์ž์ฒด๋กœ๋Š” ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๊ฐ€๋ณ๊ฒŒ ๋ Œ๋”๋งํ•˜๋Š”๊ฑด ์ œ๊ณตํ•˜์ง€ ์•Š์Œ

    • ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋งŒ ํ…Œ์ŠคํŠธํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ชจ๋‘ ๋ Œ๋”๋งํ•˜๊ฒŒ๋จ

    • ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ฐ–๋Š” ์˜์กด์„ฑ๊นŒ์ง€ ๋ชจ๋‘ ์„ค์ •ํ•ด์ค˜์•ผํ•ด์„œ ๊นŒ๋‹ค๋กœ์›€

      • jest/vitest ์˜ mock ํ™œ์šฉ

"React ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ—ฌํผ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌํŒฉํ† ๋ง์ด ์‰ฌ์›Œ์ง€๊ณ  ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์—†์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ '์–•๊ฒŒ' ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ œ๊ณตํ•˜์ง€ ์•Š์ง€๋งŒ, Jest์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจํ‚น์„ ํ†ตํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

Last updated