서론
본 포스팅은 아래의 인강을 듣고, 추가 공부가 필요한 내용들을 포함하여 정리한 포스팅입니다.
TDD(Test Driven Development - 테스트 주도 개발)
테스트 코드를 먼저 작성하여, 테스트가 구현 과정을 주도하도록 하는 방법론이다.
짧은 개발 주기의 반복에 의존하는 개발 프로세스이며, 애자일 방법론 중 하나인 XP(eXtream Programming)의 Test-First 개념에 기반을 둔 단순한 설계를 중요시한다.
XP(eXtream Programming)
미래에 대한 예측을 최대한 하지 않고 지속적으로 프로토타입을 완성하는 애자일 기방법론 중 하나로 추가 요구사항이 생기더라도 실시간으로 반영할 수 있다.
기존 방식과 비교
일반 개발 방식
일반 개발 방식은, 위의 과정을 거쳐 배포를 하게 되는데, 이러한 방식은 아래의 문제점들을 가지고 있다.
- 소비자의 요구사항이 처음부터 명확하지 않을 수 있기 때문에 처음부터 완벽한 설계가 불가능하다.
- 자체 버그 검출 능력 저하 또는 소스 코드의 품질이 저하될 수 있다.
- 테스트 비용이 증가할 수 있다.
위의 문제점들은 소프트웨어 개발의 속도를 느리게 만든다.
어느 프로젝트든 초기 설계가 완벽할 수는 없다. 고객의 요구사항 또는 디자인의 오류 등 많은 외부 또는 내부 조건에 의해 재설계되어 점진적으로 완벽한 설계로 나아가는데, 재설계로 인해 개발자는 코드를 삽입, 수정, 삭제하는 과정에서 불필요한 코드가 남거나 중복되는 코드를 생성할 가능성이 크다. 이러한 코드들은 재사용이 어렵고 관리가 어렵기 때문에 유지보수를 어렵게 만든다.
또한 작은 수정에도 모든 기능을 다시 테스트해야하는 문제가 발생하여 자체 테스트비용이 증가하게 된다.
TDD 개발 방식
위에서 언급한 것 처럼, TDD는 테스트 코드를 작성한 뒤 실제 코드를 작성한다. 설계 단계에서 프로그래밍 목적을 반드시 미리 정의해야만 하고, 테스트 케이스를 작성해야만 한다.
테스트 코드를 작성하는 도중 발생하는 예외 사항은 테스트 케이스에 추가하고 설계를 개선한다. 이후 테스트가 통과된 코드만을 코드 개발 단계에서 실제 코드로 작성한다.
이러한 반복적인 단계를 통해 자연스럽게 코드의 버그가 줄어들고 소스코드는 간결해진다. 또한 테스트 케이스 작성으로 인해 자연스럽게 설계가 개선됨으로써 재설계 시간이 줄어든다.
TDD 개발 사이클(주기)
- Red -실패하는 테스트 코드를 먼저 작성한다.
- Green - 테스트 코드를 성공시키기 위한 실제 코드를 작성한다.
- Blue - 중복 코드 제거, 일반화 등의 리팩토링을 수행한다.
예시
아래 예시는, TDD의 개발 사이클을 활용한 예시이다.
1. 테스트 할 코드를 먼저 작성한다.
@Test
void totalPrice(){
Calculator calculator = new Calculator();
Pizza pizza = new Pizza();
Chicken chicken = new Chicken();
calculator.add(pizza);
calculator.add(chicken);
int totalPrice = calculator.calculateTotalPrice();
assertThat(totalPrice).isEqualTo(25000);
}
2. 구현부에서 기능 코드를 구현한다.
public int calculateTotalPrice() {
int totalPrice = 0;
for(Product p : products) {
totalPrice += p.getPrice();
}
return totalPrice;
}
3. 테스트가 성공했다면, 리팩토링을 시도한다.
public int calculateTotalPrice() {
return beverages.stream()
.mapToInt(Beverage::getPrice)
.sum();
}
참조
https://younitystudy.tistory.com/58
https://hanamon.kr/tdd%EB%9E%80-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C/
관련 포스팅
테스트 코드를 작성하는 이유 - TestCode (1)
단위 테스트 - TestCode (2)
JUnit 5를 사용한 Java 단위 테스트 - TestCode (3)
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!