# TDD(Test Driven Development)
# TDD : ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ
'ํ
์คํธ๊ฐ ๊ฐ๋ฐ์ ์ด๋์ด ๋๊ฐ๋ค.'
์ฐ๋ฆฌ๋ ๋ณดํต ๊ฐ๋ฐํ ๋, ์ค๊ณ(๋์์ธ)๋ฅผ ํ ์ดํ ์ฝ๋ ๊ฐ๋ฐ๊ณผ ํ ์คํธ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
ํ์ง๋ง TDD๋ ๊ธฐ์กด ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, ํ ์คํธ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ ์ดํ์ ์ค์ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๋ ๋ฆฌํฉํ ๋ง ์ ์ฐจ๋ฅผ ๋ฐ๋๋ค.
์๊ฐ๊ฐ ์ฑ
์ ์ฐ๋ ๊ณผ์ ์ ๋ํด์ ์๊ฐํด๋ณด์.
์ฑ
์ ์ฐ๊ธฐ ์ , ๋ชฉ์ฐจ๋ฅผ ๋จผ์ ๊ตฌ์ฑํ๋ค.
์ดํ ๋ชฉ์ฐจ์ ๋ง๋ ๋ด์ฉ์ ๋จผ์ ๊ตฌ์ํ ๋ค, ์ด์์ ์์ฑํ๊ณ ๊ณ ์ณ์ฐ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค.
๋ชฉ์ฐจ ๊ตฌ์ฑ : ํ
์คํธ ์ฝ๋ ์์ฑ
์ด์ ์์ฑ : ์ฝ๋ ๊ฐ๋ฐ
๊ณ ์ณ ์ฐ๊ธฐ : ์ฝ๋ ์์ (๋ฆฌํฉํ ๋ง)
๋ฐ๋ณต์ ์ธ '๊ฒํ '์ '๊ณ ์ณ์ฐ๊ธฐ'๋ฅผ ํตํด ์ข์ ๊ธ์ด ์์ฑ๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ํํธ์จ์ด์ ์ ์ฉํ ๊ฒ์ด TDD!
์ํํธ์จ์ด ๋ํ ๋ฐ๋ณต์ ์ธ ํ ์คํธ์ ์์ ์ ํตํด ๊ณ ํ์ง์ ์ํํธ์จ์ด๋ฅผ ํ์์ํฌ ์ ์๋ค.
# ์ฅ์
์์
๊ณผ ๋์์ ํ
์คํธ๋ฅผ ์งํํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ์ค๋ฅ ํ์
์ด ๊ฐ๋ฅํจ ( ์์คํ
๊ฒฐํจ ๋ฐฉ์ง )
์งง์ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ํตํด ๊ณ ๊ฐ์ ์๊ตฌ์ฌํญ ๋น ๋ฅด๊ฒ ์์ฉ ๊ฐ๋ฅ. ํผ๋๋ฐฑ์ด ๊ฐ๋ฅํ๊ณ ์งํ ์ํฉ ํ์
์ด ์ฌ์
์๋ํ ๋๊ตฌ๋ฅผ ์ด์ฉํ TDD ํ
์คํธ์ผ์ด์ค๋ฅผ ๋จ์ ํ
์คํธ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
(์๋ฐ๋ JUnit, C์ C++์ CppUnit ๋ฑ)
๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ํ๋ ์ฑ์ ๋์์ ๊ดํ ๋ฌธ์๋ฅผ ํ
์คํธ๊ฐ ์ ๊ณตํด์ค <br>
`๋ํ ์ด ํ
์คํธ ์ผ์ด์ค๋ ์ฝ๋์ ํจ๊ป ์
๋ฐ์ดํธ ๋๋ฏ๋ก ๋ฌธ์ ์์ฑ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ข์`
# ๋จ์
๊ธฐ์กด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํ
์คํธ์ผ์ด์ค ์ค๊ณ๊ฐ ์ถ๊ฐ๋๋ฏ๋ก ์์ฐ ๋น์ฉ ์ฆ๊ฐ
ํ
์คํธ์ ๋ฐฉํฅ์ฑ, ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ฐ๋ฅธ ํ
์คํธ ํ๋ ์์ํฌ ์ ํ ๋ฑ ์ถ๊ฐ๋ก ๊ณ ๋ คํ ๋ถ๋ถ์ ์ฆ๊ฐ
# ์ ์ ๊ณ์ฐ ํ๋ก๊ทธ๋จ์ ํตํ TDD ์์ ์งํ
์ค๊ฐ๊ณ ์ฌ, ๊ธฐ๋ง๊ณ ์ฌ, ๊ณผ์ ์ ์๋ฅผ ํตํ ์ฑ์ ์ ๋ด๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์
์ ์ ์ดํฉ 90์ ์ด์์ A, 80์ ์ด์์ B, 70์ ์ด์์ C, 60์ ์ด์์ D, ๋๋จธ์ง๋ F๋ค.
TDD ํ ์คํธ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๋ค.
35 + 25 + 25 = 85์ ์ด๋ฏ๋ก ๋ฑ๊ธ์ด B๊ฐ ๋์์ผ ํ๋ค.
๋ฐ๋ผ์ assertEquals์ ์ธ์๊ฐ์ "B"๋ก ์ฃผ๊ณ , ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ณผ์ ์ ์งํํด๋ณด์
public class GradeTest {
@Test
public void scoreResult() {
Score score = new Score(35, 25, 25); // Score ํด๋์ค ์์ฑ
SimpleScoreStrategy scores = new SimpleScoreStrategy();
String resultGrade = scores.computeGrade(score); // ์ ์ ๊ณ์ฐ
assertEquals("B", resultGrade); // ํ์ธ
}
}
ํ์ฌ๋ Score ํด๋์ค์ computeGrade() ๋ฉ์๋๊ฐ ๊ตฌํ๋์ง ์์ ์ํ๋ค. (ํ ์คํธ ์ฝ๋๋ก๋ง ์กด์ฌ)
ํ ์คํธ ์ฝ๋์ ๋ง์ถฐ์ ์ฝ๋ ๊ฐ๋ฐ์ ์งํํ์
์ฐ์ ์ ์๋ฅผ ์ ์ฅํ Score ํด๋์ค๋ฅผ ์์ฑํ๋ค
public class Score {
private int middleScore = 0;
private int finalScore = 0;
private int homeworkScore = 0;
public Score(int middleScore, int finalScore, int homeworkScore) {
this.middleScore = middleScore;
this.finalScore = finalScore;
this.homeworkScore = homeworkScore;
}
public int getMiddleScore(){
return middleScore;
}
public int getFinalScore(){
return finalScore;
}
public int getHomeworkScore(){
return homeworkScore;
}
}
์ด์ ์ ์ ๊ณ์ฐ์ ํตํด ์ฑ์ ์ ๋ฟ๋ ค์ค computeGrade() ๋ฉ์๋๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
์ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์
public interface ScoreStrategy {
public String computeGrade(Score score);
}
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ธ์ ์ค๋ฒ๋ผ์ด๋ฉํ ํด๋์ค๋ฅผ ๊ตฌํํ๋ค
public class SimpleScoreStrategy implements ScoreStrategy {
public String computeGrade(Score score) {
int totalScore = score.getMiddleScore() + score.getFinalScore() + score.getHomeworkScore(); // ์ ์ ์ดํฉ
String gradeResult = null; // ํ์ ์ ์ฅํ String ๋ณ์
if(totalScore >= 90) {
gradeResult = "A";
} else if(totalScore >= 80) {
gradeResult = "B";
} else if(totalScore >= 70) {
gradeResult = "C";
} else if(totalScore >= 60) {
gradeResult = "D";
} else {
gradeResult = "F";
}
return gradeResult;
}
}
์ด์ ํ ์คํธ ์ฝ๋๋ก ๋์๊ฐ์, ์ค์ ๋ก ํต๊ณผํ ์ ๋ณด๋ฅผ ์ ๋ ฅํด๋ณธ ๋ค ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์
์ด๋ ์์ธ ์ฒ๋ฆฌ, ์ค๋ณต ์ ๊ฑฐ, ์ถ๊ฐ ๊ธฐ๋ฅ์ ํตํ ๋ฆฌํฉํ ๋ง ์์ ์ ํตํด ์์ฑ๋ ๋์ ํ๋ก์ ํธ๋ฅผ ๊ตฌํํ ์ ์๋๋ก ๋ ธ๋ ฅํ์!
ํต๊ณผ๊ฐ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ๋ฃ๊ณ ์คํํ๋ฉด, ์๋์ ๊ฐ์ด ์๋ฌ ์์ด ์ ๋๋ก ์คํ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
๊ตณ์ด ํ์ํ๋์?
๋ฑ๋ด๋ ๊ท์ฐฎ์ ๋ณด์ธ๋ค. ์ ๋ ๊ฒ ํ์ธ ์ํด๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ ์์ง ์๋๊ณ ๋ฐ๋ฌธํ ์๋ ์๋ค.
ํ์ง๋ง ์์๋ ๊ฐ๋จํ๊ฒ ๋ณด์์ ๋ฟ, ์ค์ ์ค๋ฌด ํ๋ก์ ํธ์์๋ ๋ค์ํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ์ด ํ์ํ๊ณ , ์ํ๋ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์ง ํ์ธํ๋ ๊ณผ์ ์ ํ์์ ์ธ ๋ถ๋ถ์ด๋ค.
TDD๋ฅผ ํ์ฉํ๋ฉด, ์ฒ์ ์์ํ๋ ๋จ๊ณ์์ ํ ์คํธ์ผ์ด์ค๋ฅผ ์ค๊ณํ๊ธฐ ์ํ ์ด๊ธฐ ๋น์ฉ์ด ํ์คํ ๋ ๋ค๊ฒ ๋๋ค. ํ์ง๋ง ๊ฐ๋ฐ ๊ณผ์ ์ ์์ด์ '์ด๊ธฐ ๋น์ฉ'๋ณด๋ค '์ ์ง๋ณด์ ๋น์ฉ'์ด ๋ ํด ์ ์๋ค๋ ๊ฒ์ ๋ช ์ฌํ์
๋ํ ์์ ์ฑ์ด ํ์ํ ์ํํธ์จ์ด ํ๋ก์ ํธ์์๋ ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋ถํฐ ํ์คํ๊ฒ ๋ค์ ธ๋๊ณ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ ์ง๋ณด์ ๋น์ฉ์ด ๋ ํฌ๊ฑฐ๋ ๋นํ๊ธฐ, ๊ธฐ์ฐจ์ ํ์ํ ์ํํธ์จ์ด ๋ฑ ์์ ์ฑ์ด ์ค์ํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํ์ฌ ์ค๋ฌด์์๋ TDD๋ฅผ ํ์ฉํ ๊ฐ๋ฐ์ ํตํด ์ด๋ฃจ์ด์ง๊ณ ์๋ค.