/TDD

๐Ÿช„ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(Test-Driven Development, TDD)

TDD (ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก )

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉฐ ์ ์šฉํ•ด๋ณด๋ฉฐ ๊ฒฐ๊ตญ์—๋Š” ์ข‹์€ ํ’ˆ์งˆ์˜ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


๊ฐœ๋…

  1. ๋‹จ์œ„(unit)
  • ํŠน์ • ์กฐ๊ฑด์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ• ์ง€ ์ •์˜
  • 'ํ•จ์ˆ˜'๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์ค€๋น„, ์‹คํ–‰, ๋‹จ์–ธ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค.

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณธ๋‹ค๋ฉด, ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ์ ์ƒ‰ : ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๊ณ„๐Ÿ–
  • ๋…น์ƒ‰ : ํ…Œ์ŠคํŠธ์— ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๐Ÿ– ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ฆฌํŒฉํ„ฐ : ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ํ™•์‹คํ•˜๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๐Ÿ– ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋†’์•„์ง„๋‹ค.

์„ค์น˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์žฌ์Šค๋ฏผ ์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉ

https://jasmine.github.io/pages/getting_started.html

๋‘๊ฐ€์ง€ ์„ค์น˜ ๋ฐฉ๋ฒ•

  • ์Šคํƒ ๋“œ์–ผ๋ก  (๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ์˜ฌ๋ฆฐ๋‹ค. ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง„ ์•Š๋Š”๋‹ค.)
  • ์นด๋ฅด๋งˆ (์ž๋™ํ™” ํ•ด์ค€๋‹ค. ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.)

์Šคํƒ ๋“œ์–ผ๋ก 

  • ๋จผ์ € ์Šคํƒ ๋“œ์–ผ๋ก ์œผ๋กœ ์„ค์น˜๋ฅผ ํ•ด๋ณด์ž.

ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ž€?

  • ์žฌ์Šค๋ฏผ, ์†Œ์Šค, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์Šคํƒ ๋“œ ์–ผ๋ก ์œผ๋กœ ์„ค์น˜ํ•œ ์ž์Šค๋ฏผ์€ HTML ํŒŒ์ผ์ด ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋‹ค.

๋ชจ๋“ˆ ํŒจํ„ด

  • โญ๏ธ ์ž„์˜ ๋ชจ๋“ˆ ํŒจํ„ด
  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํŒจํ„ด
    • ์‹ฑ๊ธ€ํ†ค์ด๋‹ค.

๋ชจ๋“ˆ ์ƒ์„ฑ ์›์น™

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

ํ…Œ์ŠคํŠธ ๋”๋ธ”

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํŒจํ„ด์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๊ณค๋ž€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ํŠน์ • ๋™์ž‘์„ ํ‰๋‚ด๋งŒ ๋‚ผ๋ฟ์ด์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋Š” ์ ํ•ฉํ•˜๋‹ค.
    • ๋”๋ฏธ : ์ธ์ž๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ์Šคํ… : ๋”๋ฏธ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์‹ค์ œ ๋™์ž‘ํ•˜๊ฒŒ๋” ๋งŒ๋“œ๋Š”๊ฒƒ. ๋ฆฌํ„ด๊ฐ’์„ ํ•˜๋“œ ์ฝ”๋”ฉํ•œ๋‹ค.
    • ์ŠคํŒŒ์ด : ์Šคํ…๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
    • ํŽ˜์ดํฌ : ์Šคํ…์—์„œ ๋ฐœ์ „ํ•œ ์‹ค์ œ์ฝ”๋“œ. ์šด์˜์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋ชฉ : ๋”๋ฏธ, ์Šคํ…, ์ŠคํŒŒ์ด๋ฅผ ํ˜ผํ•ฉํ•œ ํ˜•ํƒœ์ด๋‹ค.

์ž์Šค๋ฏผ์—์„œ๋Š” ์ด๋Ÿฐ ํ…Œ์ŠคํŠธ ๋”๋ธ”์„ '์ŠคํŒŒ์ด์‹œ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹

it('ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ increseAndUpdateView์‹คํ–‰', () => {
  spyon(view, 'increseAndUpdateView')
  //click !
  expect(view.increseAndUpdateView).toHaveBeenCalled()
  })

ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๋” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฃผ์ž…๋ฐ›์ž โ—๏ธ