์ง๋ 10๋ ๋์ ์ฐ๋ฆฌ ๋ถ์ผ๋ ๋๋ถ์ ์ฑ์ฅ์ ์ด๋ค๋ค. 97๋ ๋๋ง ํด๋ TDD๋ผ๋ ๊ฐ๋ ์ ์๋ฌด๋ ๋ชฐ๋๋ค. ๊ทธ ๋น์ ๋จ์ ํ ์คํธ๋ ํ๋ก๊ทธ๋จ์ด ๋์๊ฐ๋์ง ํ์ธํ๋ ์ผํ์ฑ ์ฝ๋์ ๋ถ๊ณผํ๋ค. ํ์ง๋ง ์ง๊ธ์ Agile๊ณผ TDD ๋ํ์ ๋จ์ ํ ์คํธ๋ฅผ ์๋ํํ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ด ๋ง์์ก๋ค. ํ์ง๋ง, ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ๊ธํ๊ฒ ์๋๋ฅด๋ ์์ค์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ ๋๋ก ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ฌ์ค์ ๋์ณ๋ฒ๋ ธ๋ค.
TDD ๋ฒ์น ์ธ๊ฐ์ง
- ์ฒซ์งธ ๋ฒ์น: ์คํจํ๋ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ๋๊น์ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ๋์งธ ๋ฒ์น: ์ปดํ์ผ์ ์คํจํ์ง ์์ผ๋ฉด์ ์คํ์ด ์คํจํ๋ ์ ๋๋ก๋ง ๋จ์ ํ ์คํธํ ์์ฑํ๋ค.
- ์ ์งธ ๋ฒ์น: ํ์ฌ ์คํจํ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ๋๋ก๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ํ๊ฒ ๋๋ฉด, ์ฒ์์ ๋ก์ง์ ์งค ๋ ํน์ ์ผ์ด์ค๋ฅผ ํต๊ณผํ๋ ํ ์คํธ ํจ์๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ด์ ๋ํ ๋ก์ง์ ์์ ํ๊ธฐ ๋๋ฌธ์ ์๋ง์ ํ ์คํธ ํจ์๊ฐ ๋์จ๋ค. ์งง์ ํ๋ฆ์ผ๋ก ์งํํ๊ธฐ ๋๋ฌธ์ ์ด ํ๋์ ๊ณผ์ ์ 30์ด ์ ๋๋ก ๋ฌถ์ด๊ฒ ๋๋ค. ๋ฌธ์ ๋, ์ด ๋ฐฉ์์ ์ฌ์ฉํ์ ๋ ๋์ค๋ ์ด๋ง๋ฌด์ํ ํ ์คํธ ์ฝ๋ ์์ด๋ค.
๊นจ๋ํ ํ ์คํธ ์ฝ๋ ์ ์งํ๊ธฐ
โ์ง์ ๋ถํด๋ ๋นจ๋ฆฌโ ์์ฑํ ์ ์๋ ํ ์คํธ ์ฝ๋๋ ์ข์๊น? ํ ์คํธ๋ง ํ๋ฉด ๊ทธ๋ง์ผ๊น? ํ์ง๋ง, ์ด๋ ์คํ๋ ค ํ ์คํธ๋ฅผ ์ํ๋๊ฒ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด ์ด์ ๋ ์ค์ ์ฝ๋๊ฐ ๋ณํํ๋ฉด, ํ ์คํธ ์ฝ๋๋ ๋ณํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ค์ ์ฝ๋ ๋ณํ์ ๋ฐ๋ผ ํ ์คํธ ์ฝ๋๋ ๋ณํด์ผ ํ๋๋ฐ, โ์ง์ ๋ถํด๋ ๋นจ๋ฆฌโ ์์ฑํ ํ ์คํธ ์ฝ๋๋ ๋ณ๊ฒฝ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ์ด๋ ๊ณง ๋ถ๋ด์ผ๋ก ์ด์ด์ง๊ณ , ํ์ ๋ถ๋ง์ผ๋ก ๋ณํํ๋ค. ๊ฒฐ๊ตญ ์ด๋ฅผ ํ์งํ๋ ์ํฉ์ ์ฒํ๊ฒ ๋๋๋ฐ, ์ด ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ์์ ํ ์ฝ๋๊ฐ ์ ๋๋ก ๋๋์ง ํ์ธํ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ฒฐ๊ตญ ์ด๋ ๋ง๊ฐ์ง ์ฝ๋๋ฅผ ๋ง๋ ๋ค.
ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋ ๋ชป์ง ์๊ฒ ์ค์ํ๋ค.
ํ ์คํธ๋ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ค
์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ฒํ๋ชฉ์ด ๋จ์ ํ ์คํธ๋ค. ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด, ๋ณ๊ฒฝ์ด ๋๋ ต์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๋ชจ๋ ๊ฒ์ ์ ์ ์ ์ธ ๋ฒ๊ทธ๋ค. ์ํคํ ์ณ๊ฐ ์ ์ฐํ๋๋ผ๋, ์ค๊ณ๋ฅผ ์๋ฌด์ง ์ ๋๋ด๋๋ผ๋ ์ด๋ฅผ ๊ฒ์ฆํ ์ ์๋ ์๋จ์ด ์๋ค๋ฉด ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ์ ์ฃผ์ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค์ ์ฝ๋๋ฅผ ์ ๊ฒํ๋ ์๋ํ๋ ๋จ์ ํ ์คํธ ์ํธ๋ ์ค๊ณ์ ์ํคํ ์ฒ๋ฅผ ์ต๋ํ ๊นจ๋ํ๊ฒ ๋ณด์กดํ๋ ์ด์ ๋ค.
๊นจ๋ํ ํ ์คํธ ์ฝ๋
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด ๊นจ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์๊น? ๊ฐ๋ ์ฑ์ด ๊ทธ ํต์ฌ์ด๋ค.
addPage
, assertSubString
์ ์ค๋ณต์ด ๋๋ฌด ๋ง๋ค. ๋ ์์ง๊ตฌ๋ ํ ์ฌํญ๊น์ง ์์ฑํด๋์ด ํํ๋ ฅ์ด ๋จ์ด์ง๋ค.
์ก๋คํ๊ณ ์ธ์ธํ ์ฝ๋๋ฅผ ๊ฑฐ์๋ค ์์ด๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ๋ฆฌํฉํ ๋งํ ์ฝ๋๋ Build-operate-check ํจํด์ ์ฌ์ฉํ๋ค.
- Build: ํ ์คํธ ์๋ฃ๋ฅผ ๋ง๋ ๋ค. (given)
- Operate: ํ ์คํธ ์๋ฃ๋ฅผ ์กฐ์ํ๋ค. (when)
- Check: ์กฐ์ํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ค. (then)
๊ด๋ก์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ given, when, then์ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
์ด์ค ํ์ค
์ผ๋จ ์ด์ค ํ์ค์ด ๋ฌด์จ ์๋๋ก ์ ์๋์ง ๋ถํฐ ์ดํดํด๋ณด์. Test Code๋ ๋ฌผ๋ก ์ ์์ฑํด์ผ ํ์ง๋ง ์ค์ ์ฝ๋์ฒ๋ผ ์์ฑํ ํ์๋ ์์ ์ ์๋ค. ์ฆ, Test code๊ฐ ๊ฐ์ง๊ณ ์๋ ํน์ง์ ๋ ์ ํํํ๋ ๊ฒ์ด ์ข์ ์ฝ๋์ผ ์ ์๋ค. ์ด๋ฐ ์๋ฏธ์์ ๊ฐ ์ฝ๋์ ์์น(์ค์ , ํ ์คํธ)์ ๋ฐ๋ผ ์ ์ฉ๋์ด์ผ ํ๋ ํ์ค์ ๋ค๋ฅผ ์ ์๋ค๋ ๋ง์ด๋ค.
์ ์ฝ๋๋ ํ๊ฒฝ ์ ์ด ์์คํ ์ ์ํ ํ ์คํธ ์ฝ๋์ด๋ค. ๋์ถฉ ๋ณด๋ฉด ์จ๋๊ฐ ๋จ์ด์ง๋ฉด ๊ฒฝ๋ณด, ์จํ๊ธฐ, ์กํ๊ธฐ๊ฐ ๊ฐ๋๋๋์ง ํ์ธํ๋ ์ฝ๋๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ์์ ์ฝ๊ธฐ๊ฐ ์๋นํ ์ด๋ ต๋ค. ๋จผ์ ์ธ์๋ถํฐ ์ฝ์ด์ผ ํ๊ณ , ์์ assert๋ฌธ์ ํตํด true, false๋ฅผ ๋ถ๊ฐํด์ผ ํ๋ค.
๊ทธ๋์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ค. uppercase์ lowercase๋ฅผ ํตํด On/Off๋ฅผ ๋ถ๊ฐํ๋ค. ์ด ๋ฐฉ์์ ์์ Meaningful Names์ โ๊ทธ๋ฆ๋ ์ ๋ณด๋ฅผ ํผํ๋ผโ ๊ท์น์ ์๋ฐฐ๋๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ฝ์ด๋ณด์. ์์ฃผ ์ง๊ด์ ์ผ๋ก ํด์๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๋ฌด๋ ์ฝ๊ธฐ ์ฝ๋ค.
getState
์ ๊ฒฝ์ฐ์๋ ๊ต์ฅํ ํจ์จ์ด ๋ฎ๊ฒ ์์ฑ๋์ด ์๋ค. ํจ์จ์ ๋์ด๋ ค๋ฉด StringBuffer๊ฐ ๋ ์ ํฉํ๋ค. ํ์ง๋ง ์ค์ ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ ํ
์คํธ ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค. ๋ณดํต์ ํ
์คํธ ํ๊ฒฝ์ ์์์ด ์ ํ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ์ด ์ด์ค ํ์ค์ ๋ณธ์ง์ด๋ค. ์ค์ ํ๊ฒฝ์์๋ ์ ๋๋ก ์๋์ง๋ง ํ ์คํธ ํ๊ฒฝ์์๋ ์ ํ ๋ฌธ์ ์๋ ๋ฐฉ์์ด ์๋ค.
ํ ์คํธ ๋น assert ํ๋
assert๋ฅผ ํ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ํํ๊ฐ ์๋ค. ํ์คํ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํดํ๊ธฐ ๋น ๋ฅด๊ณ ์ฝ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ํ์ฐ์ ์ผ๋ก ์ค๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์์ง๋ค. Template Method ํจํด์ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค. given/when ๋ถ๋ถ์ ๋ถ๋ชจ ํด๋์ค์ ๋๊ณ then ๋ถ๋ถ์ ์์ ํด๋์ค์ ๋๋ฉด ๋๋ค. ํ์ง๋ง ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ํฌ๋ค. ์คํ๋ ค assert๋ฌธ์ ์ด๋ ค๋ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
ํ ์คํธ ๋น ๊ฐ๋ ํ๋
์์ ๋ฐฉ์๋ณด๋ค ์กฐ๊ธ๋ ์ด์น์ ๋ง๋ ๊ฒ์ ์ด๊ฒ์ด๋ค. ์ก๋คํ ๊ฐ๋ ์ ์ฐ์์ผ๋ก ํ ์คํธํ๋ ํจ์๋ ํผํ์.
์๋ ์ธ๊ฐ์ ๊ฐ๋ ์ ํ ์คํธ ํ๊ณ ์๋ค.
- 30์ผ๋ก ๋๋๋ ๋ฌ + 1 month = ์ผ์ด 31์ด๋ฉด ์๋๋ค.
-
- 2 months์ ๋๋ฒ์งธ๊ฐ 31์ด๋ฉด ์ต์ข ๊ฒฐ๊ณผ๋ 31์ด์ด์ผ ํ๋ค.
- 31์ผ๋ก ๋๋๋ ๋ฌ + 1 month = ์ผ์ด 31์ด๋ฉด ์๋๋ค.
์ฌ๋ฌ ๊ฐ๋ ์ ํ ์คํธํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒฝ์ฐ๋ ๋ถ๋ฆฌํด์ผ ํ๋ค.
F.I.R.S.T.
๊นจ๋ํ ํ ์คํธ๊ฐ ๋ฐ๋ฅด๋ ๊ท์น์ด๋ค.
Fast
ํ ์คํธ๋ ๋นจ๋ผ์ผ ํ๋ค. ๋น ๋ฅด์ง ์์ผ๋ฉด ์์ฃผ ๋๋ฆด ์๋๋ฅผ ๋ชป๋ธ๋ค. ์ฝ๋๋ฅผ ๋ง์๊ป ์ ๋ฆฌํ๊ธฐ๋ ์ด๋ ค์์ง๋ค.
Independent
๊ฐ ํ ์คํธ๋ ์๋ก ์์กดํ๋ฉด ์๋๋ค. ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ ํ ์์๋ก ์คํํด๋ ๊ด์ฐฎ์์ผ ํ๋ค. ์์กด์ฑ์ด ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค.
Repeatable
์ด๋ ํ ํ๊ฒฝ์์๋ ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค. ์ค์ ํ๊ฒฝ, QA ํ๊ฒฝ, ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ ๋ฌด ํ๊ฒฝ ๋ฑ์์ ๋ชจ๋ ์คํ๊ฐ๋ฅํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ ์คํธ ์ฝ๋์ ์คํจ ์์ธ์ ๋ณ๋ช ํ ๊ฑฐ๋ฆฌ๊ฐ ์๊ธด๋ค. ๋ ํ๊ฒฝ์ ์์กด์ ์ด๊ธฐ ๋๋ฌธ์ ์คํ ๋ถ๊ฐ๋ฅํ๋ค๋ ๋จ์ ๋ ์๊ธด๋ค.
Self-Validating
ํ ์คํธ๋ ์ฑ๊ณต ์๋๋ฉด ์คํจ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋ค. ํ ์คํธ๊ฐ ์ค์ค๋ก ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๊ฐ๋ ํ์ง ์๋๋ค๋ฉด ํ๋จ์ ์ฃผ๊ด์ ์ด ๋๊ณ , ์์์ ํ๊ฐ๊ฐ ํ์ํ๊ฒ ๋๋ค.
Timely
ํ ์คํธ๋ ์ ์์ ์์ฑ๋์ด์ผ ํ๋ค. ๋จ์ ํ ์คํธ๋ ํ ์คํธํ๋ ค๋ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ๊ตฌํํ๋ค. ๋ง์ฝ ๋ฐ๋๊ฐ ๋๋ฉด, ์ค์ ์ฝ๋๊ฐ ํ ์คํธํ๊ธฐ ๋๋ฌด ์ด๋ ค์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
๊ฒฐ๋ก
- ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋ ๋งํผ์ด๋ ํ๋ก์ ํธ ๊ฑด๊ฐ์ ์ค์ํ๋ค.
- ์ค์ ์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๋ณด์กดํ๊ณ ๊ฐํํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
- ์ง์์ ์ผ๋ก ๊นจ๋ํ๊ฒ ๊ด๋ฆฌํ ์ฑ ์์ด ์๋ค.