[개발 상식] TDD란?
본 글은 CS 스터디를 진행하며, 작성한 글입니다. 깃허브 링크
TDD 란 무엇일까?
TDD는 기능 구현이 아닌 테스트부터 시작하는 개발 방법을 말합니다. "구현 코드가 없는데 어떻게 테스트를 하지?" 라는 의문점이 드실 수도 있습니다. 여기서 테스트를 먼저 한다는 것은 기능이 올바르게 동작하는지 검증하는 테스트 코드를 작성한다는 것입니다. 테스트 코드를 먼저 작성하고, 테스트를 통과시키기 위해 구현 코드를 작성하는 방식으로 진행합니다.
TDD로 구현한 예제
간단한 덧셈 기능을 TDD로 구현한 예제를 보여드리겠습니다.
public class CalculatorTest {
@Test
void plus() {
int result = Calculator.plus(1,2);
Assertions.assertEquals(3,result);
}
}
작성 흐름은 다음과 같습니다.
1. 덧셈 기능을 제공할 클래스, 메서드, 파라미터, 반환 타입에 대해 고민하고 int result = Calculator.plus(1,2) 코드를 작성합니다.
2. assertEquals 메서드를 사용해 예상 값과 실제값을 비교합니다.
3. 구현한 코드가 없으니 당연하게도 코드에 컴파일 에러가 발생합니다.
4. 다음과 같이 Calculator 클래스와 plus 메서드를 작성합니다.
public class Calculator {
public static int plus(int a, int b) {
return 0;
}
}
5. 테스트를 실행합니다. 예상값과 실제값이 다르니 테스트는 실패합니다.
6. 테스트를 통과할 수 있도록 구현 코드를 고칩니다.
public class Calculator {
public static int plus(int a, int b) {
return 3;
}
}
7. 테스트가 통과합니다. 그럼 새로운 테스트를 작성합니다.
public class CalculatorTest {
@Test
void plus() {
int result = Calculator.plus(1,2);
Assertions.assertEquals(3,result);
Assertions.assertEquals(5,Calculator.plus(2,3));
}
}
8. 테스트는 실패하게 되며, 통과할 수 있게 구현 코드를 변경합니다.
public class Calculator {
public static int plus(int a, int b) {
return a+b;
}
}
9. 테스트를 실행시키면 통과하는 것을 확인하실 수 있습니다. 그럼 기능 구현이 완료된 것입니다.
간단한 덧셈 기능을 TDD 개발 방식으로 구현해봤습니다.
간단한 기능을 이렇게까지 복잡하기 구현해야 하는지 의문이 들 수 있을 것입니다. 그러나 실무에서는 이런 간단한 기능이 아닌 복잡한 기능을 구현하게 됩니다.
사람은 모든 예외 사항과 기능을 한 번에 구현하기 어렵고, 완성된다고 해도 테스트에 실패할 확률이 높습니다. 그러면 디버깅을 통해 문제점을 파악해야 하는데, 이러한 과정 속에서 개발자는 시간을 낭비하게 되고 코드의 품질도 떨어질 수밖에 없습니다.
따라서 위와 같이 TDD 방식을 사용해 테스트를 먼저 작성하고 테스트에 실패하면 테스트를 통과시킬 만큼 코드를 추가하는 과정을 반복하면 낭비되는 시간도 줄일 수 있고, 코드의 품질도 향상될 수 있습니다.
TDD의 장점
1. 지속적인 코드 정리
테스트 코드가 있어 코드를 리팩토링 하는데 불안함이 없고 오히려 과감하게 할 수 있습니다. 이 과정을 반복하다 보면, 코드의 품질이 향상되는 것을 볼 수 있습니다.
2. 설계에 대한 빠른 피드백
설계가 잘 못됐을 경우 개발 코드를 먼저 작성하면, 변경이 일어나거나 사용하기 어려울 때 깨달을 수 있습니다. 그러나 테스트 코드를 먼저 작성하면, 설계에 대한 피드백이 빠릅니다.
3. 높은 테스트 커버리지
TDD 방식으로 개발을 하면 자연스럽게 테스트 커버리지가 높아집니다.
4. 오버 엔지니어링 방지
요구 사항에 맞춰 개발 코드를 구현하면, 불필요한 코드를 작성하지 않고 필요한 만큼만 개발할 수 있습니다.
참고
- 최범균님의 테스트 주도 개발 시작하기
- [10분 테코톡] 피카의 TDD와 단위테스트
'컴퓨터 공학 > 개발 상식' 카테고리의 다른 글
[개발 상식] 객체 지향 프로그래밍이란 무엇인가? (0) | 2021.11.13 |
---|---|
[개발 상식] 좋은 코드란 무엇인가? (0) | 2021.11.03 |
댓글