본문 바로가기
카테고리 없음

TDD 정리

by keward 2024. 10. 31.

 

TDD란?

TDD(Test-Driven Development, 테스트 주도 개발)는 반복 테스트를 이용한 소프트웨어 방법론으로 프로덕션 코드를 작성하기 이전에 테스트를 먼저 작성하고, 그 테스트를 통과하는 코드를 작성함으로써 테스트된 동작하는 코드를 얻는 개발 방법이다.

TDD의 핵심은 테스트 작성이 아니다. 실제 목적은 구체적인 코드를 작성해나가면서 역할, 책임, 협력을 식별하고, 식별된 역할, 책임, 협력이 적합한지를 피드백 받는 것이다.

 

"TDD는 객체가 이미 존재한다고 가정하고 객체에게 어떤 메시지를 전송할 것인지에 관해 먼저 생각하라고 충고한다. 이 같은 종류의 충고는 역할, 책임, 협력의 관점에서 객체를 바라보지 않을 경우 무의미하다."    -객체지향의 사실과 오해-

TDD의 목표

TDD의 목표는 동작하는 깔끔한 코드를 작성하는 것이다. TDD의 단계에서 리팩토링을 거치면서 중복된 코드가 제거되고, 복잡한 코드는 깔끔하게 정리된다.

또한 초반에 테스트를 먼저 작성하는 것은 개발을 느리게 하는 것 같지만 장기적으로 보면 개발 비용을 절감할 수 있다.

TDD를 통해 응집도 높고 결합도가 낮은 클래스로 구성된 시스템을 개발할 수 있다.

TDD 개발 절차

1. 실패하는 작은 단위 테스트 작성(RED, 구현부가 존재하지 않는다.)

2. 오직 테스트 통과만을 위한 프로덕션 코드 작성(가짜 구현, GREEN)

3. 통과한 프로덕션 코드를 중복 제거 및 일반화 등의 리팩토링을 통해 개선한다.(BLUE)

 

BLUE과정에서  테스트 통과를 유지시키며 같은 기능이라는 것을 테스트가 보장해준다.

 

TDD개발 절차에는 3가지 원칙이 있다.

1. 실패하는 단위 테스트를 작성할 때까지 프로덕션 코드를 작성하지 않는다.

2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.

3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. -> 오버엔지니어링을 방지

 

TDD 예시

간단한 덧셈에 대한 예시이다.

 

먼저 테스트를 작성하는데 Calculator 객체의 책임과 어떤 행위가 있을지 생각하고, 덧셈이라는 행위가 있다고 판단하여, 덧셈 메서드에 대한 테스트를 작성한다.

public class CalculatorTest {
	@Test
    void plusTest(){
    	//given
    	Calculator calculator = new Calculator();
        
    	//when
    	int result = calculator.plus(2,3);
    
    	//then
        assertThat(result).isEquals(5);
    }

}

 

해당 테스트는 Calculator 클래스가 존재하지 않기 때문에 컴파일 에러가 발생한다.

 

Calculator 클래스를 생성해준다.

public class calculator{
	public int plus(int number1, int number2){
    	return 0;
    }
}

plus라는 메서드를 추가하고 내부로직은 존재하지 않는다.

 

다시 테스트를 돌리면 테스트 실패가 발생한다.(RED)

 

일단 테스트를 통과할 수 있게 수정한다.(가짜 구현)

public class calculator{
	public int plus(int number1, int number2){
    	return 5;
    }
}

테스트를 돌리면 테스트가 통과하게된다.(GREEN)

 

테스트를 통과할 수 있지만 내부로직은 존재하지 않기 때문에 내부로직을 포함하여 다른 값을 넣어도 올바르게 동작하는 코드로 수정한다.

public class calculator{
	public int plus(int number1, int number2){
    	int result = number1 + number2;
        return result;
    }
}

이 코드 또한 테스트 코드가 통과하고 로직 또한 올바르게 동작하는 로직이다.

하지만 리팩터링을 할 수 있는 부분이 존재한다.

리팩토링이 가능하면 리팩토링을 하여 로직을 개선한다.(BLUE)

 

public class calculator{
	public int plus(int number1, int number2){
        return number1 + number2;
    }
}

 

 

TDD의 장단점

장점

  • 버그가 발생하는 위치를 명확하게 할 수 있다.
  • 지속적으로 변경되는 요구사항에 유연하게 대처할 수 있다.
  • 코드가 간결해진다.
  • 손을 벗어나기 전에 피드백을 빠르게 받을 수 있다.
  • 확장성 및 수정성이 높아진다.

단점

  • 기존에 1번 작성할 코드를 2번 작성하기 때문에 생산성이 낮아진다.