2010๋ ์ ์ฐ์ธ ๐ ์ฑ์์๋์ TDD ์ค์ฒ๋ฒ๊ณผ ๋๊ตฌ ๊ณต๊ฐ PDF ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
์ง๊ธ๊น์ง๋...
๋ด๊ฐ ์ง๊ธ๊น์ง ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ ๋ ํ๋ ๋ฐฉ์์ ์ค๊ฐ์ค๊ฐ println ์ด๋ congole.log ๋ , ํน์ logging ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฝ์์ฐฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ด๋ณด๋ฉฐ ์ฝ๋๋ฅผ ๊ฒ์ฆํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์์ ์ ๋จธ๋ฆฌ๋ก ๋๋ถ๋ถ์ ์์กดํด์ผํ๋ค. ๊ฒ๋ค๊ฐ ๋ง์ฝ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์ฝ๋์ ์ผ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด? ๋ค์ ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ๋ฌธ์ ๋๋ ๋ถ๋ถ์ ์ดํด๋ณด๋ ์์ ์ ๋ฐ๋ณตํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ฝ๋์ ๋ชธ์ง์ด ๊ฑฐ๋ํด์ง๋ค๋ฉด? ๋๋ฒ๊น ํด์ผํ๋ ๋ถ๋ถ์ ์ฐพ์๋ด๊ธฐ ๋ ์ด๋ ค์์ง๋ค. ์ ์ ์ฐจ๋ ค๋ณด๋ฉด ์ด๋์ ๋ก๊ทธ ์ฐ๋ ์ฝ๋๊ฐ ๋น์ฆ๋์ค ๋ก์ง๋งํผ ์ ํ ์๋ค.
TDD, ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ
๊ทธ๋์ ๋์จ ๊ฒ์ด ํ ์คํธ๊ฐ ์ฃผ๋ํ๋ ๊ฐ๋ฐ, TDD ๋ค. ํ ์คํธ๊ฐ ์ฃผ๋ํ๋ค๋ ๊ฑด ํจ์๋ ๋ชจ๋์ ๋ง๋ค๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ๋จผ์ ํ๋ค๋ ๊ฒ์ด๋ค. ํ๋ก๋์ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ ์์๋๋ฐ ์ด๋ป๊ฒ ํ ์คํธํ์ง? ๋ผ๋ ์๋ฌธ์ ๊ฐ์ก๋๋ฐ, ์๋ ์ค๋ช ์ ๋ณด๋ ์ดํด๊ฐ ๋์๋ค.
ํ ์คํธ๋ฅผ ๋จผ์ ํ๋ผ!
int a, b ๋ฅผ ๋ํ ํฉ๊ณ๋ฅผ ๋ฐํํ๋ sum ํจ์๋ฅผ ์๊ฐํด๋ณด์. ์ ์์ ์ผ๋ก ๋์ํ๋ค๋ฉด sum(a,b) = (a+b) ๊ฐ true ์ผ ๊ฒ์ด๋ค. ํ๋ก๋์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ์ด๋ป๊ฒ ํ ์คํธํ ์ง ๊ฐ์ด ์กํ๋ค. sum(1,2) = 3 / sum(6, 20) = 26 ์ด true ์ธ์ง false ์ธ์ง ๊ฒ์ฌํ๋ฉด ๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์.
public class Calculator {
public int sum(int a, int b) {
return 0;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println( calc.sum(10, 20) == 30);
System.out.println( calc.sum(1, 2) == 3);
System.out.println( calc.sum(-10, 20) == 10);
System.out.println( calc.sum(0, 0) == 0);
}
}
-----์คํ ๊ฒฐ๊ณผ-----
false
false
false
true
์ฌ๊ธฐ์๋ main ๋ฉ์๋๊ฐ ํ ์คํธ ๋ฉ์๋์ฒ๋ผ ์ฌ์ฉ๋์๋ค. ํ ์คํธ ๋์์ธ sum ๋ฉ์๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์๋ ๋น ์ํ์ด๋ค. ๋ชธ์ฒด ์์ ๊ตฌํํ์ง ์๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ฐ๊ฐ์ ํ ์คํธ ์ฝ๋๋ฅผ ํ ์คํธ ์ผ์ด์ค๋ผ๊ณ ํ๋ค. ๋ชธ์ฒด๊ฐ ๊ตฌํ๋์ง ์์์ผ๋ ํ ์คํธ ์ผ์ด์ค๋ค์ ๋น์ฐํ ์คํจํ๋ค. ์ผ๋ถ๋ฌ ์คํจํ๋ ์ฝ๋๋ฅผ ์ง ๊ฒ์ด๋ค.
ํ ์คํธ ์ผ์ด์ค๋ค์ ๋ฐ๋ก ์์์ ๋งํ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค. 10+20 = 30 ์ด ๋์ค๋ฉด ์ข ๋ฃ, -10+20=10 ์ด ๋์ค๋ฉด ์ข ๋ฃ... ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ์ผ๋ ์ด์ ๋ชธ์ฒด, ์ค์ ํ๋ก๋์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋๋ ธ์ ๋ ํ ์คํธ ์ผ์ด์ค๋ค์ด ๋ชจ๋ true ๋ก ์ถ๋ ฅ๋๋ฉด sum ๋ฉ์๋๋ ์ ์์ ์ผ๋ก ์์ฑ๋๋ค๊ณ ํ๋จํ๋ค. ์ดํ์๋ ํ ์คํธ๋ฅผ ํต๊ณผํ ํ๋ก๋์ ์ฝ๋๋ฅผ ์ค๋ณต๋ ๋ก์ง์ด ์๋์ง, ์ธ๋ฐ์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ์ง ์์๋์ง ์ดํด๋ณด๊ณ ๋ฆฌํฉํ ๋งํ๋ค.
์ด๋ ๊ฒ ๋ฉ์๋ ๋จ์๋ก ํ๋ ํ ์คํธ๋ฅผ ๋จ์ ํ ์คํธ(unit test) ๋ผ๊ณ ํ๋ค. ๋จ์ํ ์คํธ๋ฅผ ์ํํจ์ผ๋ก์จ ์ดํ์ ๋ฐ์ํ๋ ํ ์คํธ ๋จ๊ณ์์์ ๊ฒฐํจ ๋น์ฉ์ ์ค์ธ๋ค. ๊ฒฐํจ์ ๋นจ๋ฆฌ ๋ฐ๊ฒฌ๋ ์๋ก ์ ์ ๋น์ฉ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ์ฌ๊ธฐ์๋ println ์ผ๋ก ์ถ๋ ฅํ์ง๋ง, ์ด๊ฑธ ์๋์ผ๋ก ํ์ธํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์์ผ๋ ๊ทธ๊ฑธ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ค์ ๋ก๊ทธ๋ฅผ ํ๋ํ๋ ์ฐ์ง ์์๋ ์ ๋ ๊ฒ ํ ์คํธ ์ผ์ด์ค๋ง ๋ง๋ค์ด๋๋ฉด ์๋์ผ๋ก ํ ์คํธํ ์ ์๋ ๊ฒ์ด๋ค.
TDD ์ ํ๋ก์ธ์ค
์์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ (ํ๋ก๋์ ์ฝ๋๊ฐ ์๋ ๋น ํจ์์ด๋ฏ๋ก) ์คํจํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ -> ํ ์คํธ๊ฐ ํต๊ณผํ๋ ํ๋ก๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ -> ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ์ฌ์ดํด์ ๋ ๋ ๊ทธ๋ฆฐ ์ฌ์ดํด์ด๋ผ๊ณ ํ๋ค.
๋ญ๊ฐ ์ข์๊น?
์์์ ๊ฐ๋ตํ๊ฒ ๋งํ๊ณ ๋์ด๊ฐ๋ ํ ์คํธ ๊ฐ๋ฐ์ ์ฅ์ ์ ์๋์ ๊ฐ๋ค.
- ๊ฐ๋ฐ๋จ๊ณ ์ด๊ธฐ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์์ค๋ค.
- ๋์ค์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ๋ผ์ด๋ธ๋ ์ด๋ ๋ฑ ๊ธฐ์กด ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ ์ ์๋ค.
- ๋จ์ ํ ์คํธ ์์ฒด๋ฅผ ๋ฌธ์๋ก ์ฌ์ฉํ ์ ์๋ค.
์ด์ ํ ์คํธ๋ฅผ ๋จผ์ ํ๋ค๋ ๋ง์ด ๋ฌด์์ธ์ง ์ดํด๊ฐ ๋์๋ค. ์ด๋ ค์ด ๊ธฐ์ ์ ์ด ๊ฒ๋ ์๋๋ค. ํ๋ก๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ์ด๋ค!
์ง์ง ๊ฐ๋จํ ๊น?
์ด๋ ๊ฒ ๊ฐ๋จํ ๊ฒ์ฒ๋ผ ๋งํ์ง๋ง, TDD ๋ฅผ ์ ์ฉํ๊ธฐ ์ด๋ ค์ด ์ํฉ์ด ๋ง๋ค. ํนํ ์์กด๊ด๊ณ๊ฐ ๋ง์ ๋ชจ๋์ TDD ๋ฅผ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค... ๊ทธ๋์ ์ด์ ์๋ ์ต์ํ์ ํ ์คํธ ์ฝ๋๋ง ์์ฑํ์๋๋ฐ ์์ฆ ์ถ์ธ๋ ๋๋ถ๋ถ์ ์๋น์ค ํ์ฌ๊ฐ ํ ์คํธ ์ฝ๋์ ๊ดํด ์๊ตฌํ๊ณ ์๋ค๊ณ ํ๋ค. ์ฝ๋ฉ ํ ์คํธ๋ฅผ ๋จ์ ํ ์คํธ๋ก ๋ณด๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ...
TDD ์ ์ ์ ์ฌํญ
ํ ์คํธ ์ผ์ด์ค์ ์ด๋ฆ
์ข์ ์ฝ๋๋ ํญ์ ๋งํ์ง๋ง, ์ฌ๋์ด ์ฝ๊ธฐ์๋ ํธํ ์ฝ๋๋ค. ํ ์คํธ ์ผ์ด์ค๋ ํ์ '์ด๋ฐ ์ํฉ์ ์ด๋ ๊ฒ ํ ์คํธ ๋๊ณ ์๊ตฌ๋' ๋ฅผ ํ์ ํ ์ ์๋ ์ข์ ๋ช ์ธ์๊ฐ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฆ์ ์๋ฏธ ์๊ฒ ์ง์.
์ผ์ด์ค๋ ๋ง์ ์๋ก ์ข์ ๊ฒ ์๋๋ค
์๋ํ๋ ํ ์คํธ ์ผ์ด์ค๋ ์์คํ์ง์ ๋์ฌ์ฃผ์ง๋ง, ๊ทธ๋ ๋ค๊ณ ๋ง์ ๊ฒ ์ข์ ๊ฑด ์๋๋ค. ์ค๋ณต๋ ์ผ์ด์ค๋ ๋ ์ด์ ์ ๋๋ก ๋์ํ์ง ์๋ ์ผ์ด์ค๋ ๊ณผ๊ฐํ ์ญ์ ํ๋ ๊ฒ ์ข๋ค. ๋ ๋ชจ๋ ์ํฉ์ ๋ํ ์ผ์ด์ค๋ฅผ ๋ง๋ค ํ์๋ ์๋ค. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ด๋ผ๊ณ ํด์ ํ ์คํธ์๊ฒ ์ฃผ๋๋๋ ๊ฐ๋ฐ์๊ฐ ๋๋ผ๋ ๊ฑด ์๋๋ค. ํ ์คํธ๋ ์ํํธ์จ์ด๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธ์ ์ํ ๋ณด์กฐ ๋๊ตฌ์ด๋ค.
์ฌ๋ฌ ๊ฐ์ fail ํ ์คํธ ์ผ์ด์ค๋ฅผ ํ ๋ฒ์ ๋ง๋ค์ง ์๋๋ค
๊ฐ๋ฐ ์ค์๋ ์์ฑํ๊ณ ์๋ ํ๋์ ํด๋์ค์ ํ๋์ ์คํจํ๋ ํ ์คํธ๋ง ์ ์งํ๋ค. ํด๋น ์คํจ๋ฅผ ์ฑ๊ณต์ํจ ํ ๋ค์ ์คํจ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ ์ข๋ค. (๋ฌด์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์ฑํ๋ฉด ๋น์ฐํ ์ข์ ํ ์คํธ ์ฝ๋๋ฅผ ์ธ ์ ์์ผ๋...)
ํ๋์ ํ ์คํธ ์ผ์ด์ค๋ ํ๋๋ง ํ ์คํธํ๋๋ก ํ๋ค.
ํ๋์ ํ ์คํธ ๋ฉ์๋์์ ํ๋ ์ด์์ ํญ๋ชฉ์ ํ๊บผ๋ฒ์ ํ ์คํธํ๋๊ฑด ์ข์ง ์๋ค. getter, setter ์ฑ๊ฒฉ ๋น์ทํ๋ ๋ ๋ค ํ ์คํธํด! ๋ ๋ฐ๋์งํ์ง ๋ชปํ ํ ์คํธ๋ค...
์ด๋ฐ ํ๋ฆ์ ์ ์งํ๋ฉด ์ข๋ค.
์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ฌธ๋งฅ์ ๋ง๊ฒ ์ ์ค๊ณํ๊ณ , ํ๋ก๋์ ์ฝ๋๊ฐ ๋๋ ต๋๋ผ๋ ์ต๋ํ ๋น ๋ฅด๊ฒ ํ ์คํธ ์ฝ๋๋ฅผ ํต๊ณผํ๋๋ก ์์ฑํ ์ดํ ๋ฆฌํฉํ ๋ง์ ํ๋ ๋ฆฌ๋ฌ์ ์ ์งํ๋ ๊ฑธ ์ถ์ฒํ๋ค.