๐Ÿงช TDD(Test Driven Development)

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์ฆ‰, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„

TDD์˜ ๋‹จ๊ณ„

TDD ์—์„œ๋Š” ์ฝ”๋”ฉ์„ ํ• ๋•Œ ๊ธฐ๋Šฅ์„ ๋ฐ”๋กœ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ๋‹ค. ์ด๋•Œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„์˜ ๋ฐ˜๋ณต์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

  1. ์ ์ƒ‰ ๋‹จ๊ณ„ : ์„ฑ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๋Š” ๋‹จ๊ณ„
  2. ๋…น์ƒ‰ ๋‹จ๊ณ„ : ํ…Œ์ŠคํŠธ์— ์„ฑ๊ณตํ•œ ๋‹จ๊ณ„
  3. ๋ฆฌํŒฉํ„ฐ ๋‹จ๊ณ„ : ํ…Œ์ŠคํŠธ์— ์„ฑ๊ณตํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋‹จ๊ณ„ (refactoring)
    (์ด๋ฏธ์ง€ ์ถœ์ฒ˜ - ํ”„๋ก ํŠธ์—”๋“œ์Šค์ฟจ 5๊ธฐ ๊ต์•ˆ)

TDD ๋ฐฉ๋ฒ•๋ก 

Unit Test

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ฅผ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๋‹จ์œ„๋Š” ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋ฉฐ ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.

E2E Test

E2E(End-to-End) ํ…Œ์ŠคํŠธ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์˜ ์ „์ฒด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง€์›ํ•˜๋Š” API ๋ช…๋ น์–ด์˜ cy.visit() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • URL๋กœ ์ด๋™ํ•˜๊ณ  cy.click() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ง์ ‘ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค(QAํŒ€).

TDD์˜ ์žฅ์ 

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

TDD๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์ 

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

TDD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

https://github.com/yoonmallang22/TDD

๐Ÿ’ก ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ

  • ํ…Œ์ŠคํŠธํ•  ์ฝ”๋“œ๋ฅผ UI์—์„œ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ JSํŒŒ์ผ๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ํ•จ์ˆ˜ ๋ฐ–์— ์žˆ๋Š” ๋‚ด์šฉ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Jasmine

Jest๐ŸŒŸ

HTML ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ์ ‘๊ทผ์„ฑ ๋งˆ์ปค ์ฆ‰, WAI-ARIA๋ฅผ ์ด์šฉํ•œ๋‹ค. TDD๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ ‘๊ทผ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๐Ÿ’ก ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€