tdd

โœ”๏ธ TDD | ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ, ์œ ๋‹› ํ…Œ์ŠคํŠธ(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค)

grasinnong 2020. 11. 25. 06:03

 

Test-driven development

 

TDD๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์—, ๋จผ์ € ๋””๋ฒ„๊น…์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋””๋ฒ„๊น…์€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ๐Ÿ› ๋ฒ„๊ทธ๋ฅผ ์žก๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ฌธ์ œ์˜ ์›์ธ์„ ์žก์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. 

 

๋””๋ฒ„๊น…์„ ๋ชจ๋ฅธ๋‹ค๋ฉด, ์‚ฝ์งˆ์„ ํ•˜๊ณ ๋„ ์›์ธ์„ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ด๋‹ค. ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์€ ๊ฐœ๋ฐœ์—์„œ ๋–ผ์–ด๋†“์„ ์ˆ˜ ์—†๋Š” ์Šคํ‚ฌ์ด๋‹ค. 

 

 

sum ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„, ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. โŒ ๋ฒ„๊ทธ๊ฐ€ ์žกํžŒ ๊ฒƒ์ด๋‹ค. 

 

 

๋””๋ฒ„๊ฑฐ๋กœ ํ™•์ธ์„ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ์›์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. "์›์ธ์€ xํ‘œ์‹œ๊ฐ€ ๋‚œ ๊ณณ์ด๊ตฌ๋‚˜!" ๊ทธ๋ฆฌ๊ณ  console.lo๊ฐ€ function์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ TDD์ด๋‹ค. TDD๋กœ ํ–ˆ์„ ๋•Œ๋Š” 

 

  it("sum ํ•จ์ˆ˜๋Š” ์ธ์ž๊ฐ’๋“ค์„ ๋”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", function(){
    let result = sum(1,2);
    expect(result).toEqual(3);
  })

 

์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์œ„์— ์ฝ”๋“œ์ฒ˜๋Ÿผ '๋งŒ์•ฝ 1,2๋ฅผ sum์ด๋ผ๋Š” ํ•จ์ˆ˜์— ์ธ์ž๊ฐ’์œผ๋กœ ์ฃผ์—ˆ์„ ๋•Œ, result๊ฐ€ 3์ด๊ธธ ๋ฐ”๋ž€๋‹ค' ๋ผ๊ณ  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ๊ธฐ๋Œ“๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๐Ÿ“Œ  ์œ ๋‹›ํ…Œ์ŠคํŠธ

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ๊ธฐ๋Œ“๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๋Ÿฌํ•œ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์„ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.  

 

์œ ๋‹›์€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋œปํ•œ๋‹ค. ์œ ๋‹›ํ…Œ์ŠคํŠธ ํ•ด์•ผํ•  ๊ฒƒ์€ ์ด ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋“ค์ด ์ž์‹ ์˜ ์—ญํ• ์„ ์•ฝ์†ํ•œ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

 

๐Ÿ“Œ  TDD 

Test-driven Development์˜ ์•ฝ์ž๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ด๋“œ๋ผ์ธ์ฒ˜๋Ÿผ ๋”ฐ๋ฅด๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.  

 

์ด๋ฏธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€, ๊ณ ๋ฏผ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ์–ด๋–ค๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ์ฝ”๋“œ์ด๊ณ , ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์˜ˆ์ •์ธ์ง€์— ๋Œ€ํ•œ ๊ตฌ์ƒ์ด ๋๋‚ฌ์„ ๋•Œ ํ…Œ์Šคํฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ TDD๋กœ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ดค์„ ๋•Œ๋Š” ๋ฏธ๋ฆฌ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ(Design) ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถฐ ์˜คํžˆ๋ ค ์‹œ๊ฐ„์„ ๋” ์•„๋‚„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“Œ  TDD๋ฅผ ํ•˜๋Š” ์ด์œ 

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

 

ํ•˜์ง€๋งŒ TDD๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค๋ฉด ๋ฏธ๋ฆฌ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์งค ์ˆ˜ ์žˆ์–ด ํ˜‘์—…์„ ํ•˜๋Š” ๋ฐ๋„ ๋” ํŽธ๋ฆฌํ–ˆ์„ ๊ฒƒ์ด๊ณ , ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ ์ˆ˜์›”ํ–ˆ์„ ๊ฒƒ์ด๊ณ , ์™œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”์ง€ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๊ณ , ์ข€ ๋” ์ •๋ˆ๋œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๋˜, ๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ๋‚ด๊ฐ€ ์˜ˆ์ƒํ–ˆ๋˜ ๋Œ€๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋ผ๋Š” ํ™•์‹ ์ด ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ๋„ TDD๋Š” ์ •๋ง ์ค‘์š”ํ•œ ์Šคํ‚ฌ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

 

์ด์ฒ˜๋Ÿผ TDD๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€์ด๋“œ ์—ญํ• ์„ ํ•ด์ค€๋‹ค. ๋ฒ„๊ทธ์˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์—ฌ์ฃผ๊ณ , ํ…Œ์ŠคํŠธ ์ž์ฒด๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋„ ์—ญํ• ์— ๋งž๊ฒŒ ๋ถ„๋ช…ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๋‹ค. (SimpleDesign) 

 

๐Ÿ“Œ TDD ์‹ค์ „

1. ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๊ณ , ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ๊ธฐ๋Œ“๊ฐ’์„ ํ…Œ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•œ๋‹ค. 

2. ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚จ๋‹ค. 

3. ์ฝ”๋“œ๋ฅผ ๋” ๋ฐ”๋žŒ์งํ•˜๊ฒŒ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค.(refactor)

4. ๋‹ค์‹œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

 

TDD๋Š” ์ด ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์‹œ๊ฐ„์ด ๊ฝค ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ฒ ์ง€๋งŒ ํ™•์‹คํžˆ ํ€„๋ฆฌํ‹ฐ ๋†’์€ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

 

Test Framework

โ€ป ํ”„๋ ˆ์ž„์›Œํฌ : ๋ผˆ๋Œ€, ๊ธฐ๋ฐ˜๊ตฌ์กฐ

โ€ป ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๋‹จ์ˆœ ํ™œ์šฉ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋“ค์˜ ์ง‘ํ•ฉ

 

 

์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๋“ค์ด TDD๋ฅผ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ์—ฌ์„œ ๋งŽ์€ ํ…Œ์ŠคํŠธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ œ์ž‘ํ–ˆ๋‹ค.

 

๋‚˜๋Š” mocha, chai๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋Š”๋ฐ, ๊ทธ ์™ธ์—๋„ jest, supertest,jasmine ๋“ฑ ๊ต‰์žฅํžˆ ๋งŽ์€ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. 

 

 

๐Ÿ“Œ Mocha 

๋ชจ์นด๋Š” Node.js ํ”„๋กœ๊ทธ๋žจ ์šฉ JavaScript ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค. ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์„ค์น˜๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— devDependencies ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

  $ npm install -g mocha --save-dev

 

์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  describe("sum", function() {
  let assert = function(isTrue) {
    if (!isTrue) {
      throw new Error("Test failed");
    }
  };

  it("1๊ณผ 2๋ฅผ ๋„ฃ์—ˆ์„ ๋•Œ, 3์ด ๋‚˜์™€์•ผํ•œ๋‹ค.", function() {
    assert(sum(1,2) === 3);
  });

  it("2์™€ 10์„ ๋„ฃ์—ˆ์„ ๋•Œ, 12๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค.", function() {
    assert(sum(2,10) === 12);
  });
});

1. describe("title", function(){...})

๊ตฌํ˜„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋“ค์–ด๊ฐ„๋‹ค. it ๋ธ”๋ก๋“ค์„ ํ•˜๋‚˜๋กœ ๋ชจ์•„์ฃผ๋Š” ์„ค๋ช…์ด๋‹ค. 

 

2. it("์ผ€์ด์Šค ์„ค๋ช…",  function(){...})

์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ผ€์ด์Šค ์„ค๋ช…์„ ์ ์–ด์ฃผ๊ณ , ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

chai๋Š” assert๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ •์˜ํ•  ํ•„์š” ์—†์ด assertion์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 

 

 

 

์œ ๋‹› ํ…Œ์ŠคํŠธ vs ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ vs ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

 

๐Ÿ‘‰ ์œ ๋‹› ํ…Œ์ŠคํŠธ(unit test) 

๋ณต์žก๋„  | ์–ด๋ ค์›€ โญโญ

์œ ๋‹› ํ…Œ์ŠคํŠธ๋ž€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์ด๋‹ค. ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ‘‰ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration test)

๋ณต์žก๋„ | ์–ด๋ ค์›€ โญโญโญ

ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋“ค์ด ์ž˜ ์—ฐ๊ณ„๋˜์–ด์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

๐Ÿ‘‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ(functional test)

๋ณต์žก๋„ | ์–ด๋ ค์›€ โญโญโญโญโญ

๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์œ ์ €์™€ ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ์‹œ)

 

 

 

 

 

[๊ด€๋ จ๋„์„œ] 

 

 

 

 

 

[์ฐธ๊ณ ์ž๋ฃŒ] ko.javascript.info/testing-mocha

 

ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์™€ Mocha

 

ko.javascript.info

www.youtube.com/watch?v=oneGCBiPK_Q