-
โ๏ธ TDD | ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ, ์ ๋ ํ ์คํธ(ํ ์คํธ ์ผ์ด์ค)tdd 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
www.youtube.com/watch?v=oneGCBiPK_Q
'tdd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ๏ธ TDD | Jest ์ฌ์ฉํด๋ณด๊ธฐ (0) 2021.12.07