코딩 규칙과 방법들

테스트 주도 개발 TDD는 무엇일까?

SoU330 2024. 10. 22. 22:55

 

 

 

TDD (Test-Driven Development) 

소프트웨어 개발 방법론 중 하나로 코드를 작성하기 전에 테스트 코드를 먼저 작성하고, 그 테스트를 통과하는 코드를 구현하는 방식이다.

TDD는 코드의 품질을 높이고 버그를 줄이기 위한 강력한 방법론으로 코드 설계와 테스트를 동시에 개선할 수 있다.

 

TDD 방식의 핵심은 "테스트가 코드를 이끈다" 는 원칙이다. 
테스트를 먼저 작성하고, 그 테스트를 통과하기 위한 최고한의 코드를 작성한 후 리팩토링을 통해 개선하는 과정을 반복하게 된다.

 

 

 

 

 

 

 

TDD의 3단계 (Red-Green-Refactor)

Red : 실패하는 테스트 작성

Green : 테스트를 통과하는 최소한의 코드 작성

Refactor : 중복 제거, 코드 개선, 최적화

 

 

 

 

Red- 실패하는 테스트 작성

테스트 작성 : 우선 구현할 기능에 대한 테스트 코드를 작성한다. 이 때는 테스트를 실패할 수 밖에 없는 상태로 작성해야 한다. 왜냐하면 아직 그 기능이 구현되지 않았기 때문이다.

테스트는 가능한 작은 단위로 함수나 클래스가 특정한 동작을 하는지를 검증하는 코드이다.

이 단계에서 테스트가 빨간색(실패)이어야 한다. 이 상태에서 기능 구현을 시작한다.

public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);  // 아직 add() 메서드가 없으므로 실패함
    }
}

 

여기서 Calculator 클래스와 add() 메서드는 아직 구현되지 않았기 때문에 이 테스트는 실패한다.

 

 

 

 

Green - 최소한의 코드 작성

기능 구현 : 테스트를 통과할 수 있는 최소한의 코드를 작성한다. 이 단계에서는 가능한 간단하게 구성하여 테스트가 성공하게 만든다. 최대한 빠르게 테스트를 통과하는 것에 집중한다.

이 때는 코드를 완벽하게 최적화하거나 깨끗하게 작성하는 것이 목표가 아니라 테스트를 통과히키는 것에만 집중해야 한다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

이제 Calculator 클래스와 add() 메서드를 구현했으므로, testAdd() 테스트가 성공하게 된다.

 

 

 

 

Refactor - 코드 개선

리팩토링 : 테스트가 통과하면 이제 코드를 개선하는 단계이다. 코드 중복을 제거하고 코드의 가독성, 유지보수성을 높이는 방향으로 리팩토링을 진행한다. 이 때 중요한 점은 리팩토링 중에도 기존 테스트들이 모두 통과해야 한다는 것이다.

리팩토링 과정에서 코드를 최적화하고, 더 좋은 설계 방식으로 개선할 수 있다.

 

 

 

 

 

 

 

 

TDD를 잘 활용하기 위한 팁

  • 작은 단위로 시작
    테스트는 가능한 한 작은 단위로 작성하는 것이 좋다. 작은 기능부터 시작하여 점차 큰 기능으로 확장해나가는 방식이 효과적이다.
  • 테스트는 독립적이어야 한다
    각 테스트는 서로 독립적으로 동작해야 하며 다른 테스트에 영향을 주지 않도록 작성해야 한다.
  • 실제 코드와 테스트 코드를 분리
    테스트 코드는 실제 코드와 별도로 관리되며 테스트 코드가 실제 로직에 종속되지 않도록 작성해야 한다.
  • 테스트는 가능한 명확하게 작성
    테스트는 다른 개발자가 봤을 때도 어떤 기능을 테스트하는지 쉽게 이해할 수 있도록 명확하게 작성해야 한다. 테스트 코드도 코드 품질의 일부분이기 때문에 가독성이 중요하다.

 

 

 

 

 

 

처음 TDD를 접하면 '왜 테스트를 먼저 작성해야 할까?'라는 의문을 가질 수 있다. 하지만 실제로 적용해보면 테스트를 먼저 작성함으로써 자신이 구현하려는 기능에 대해 더 깊이 생각하게 되고 코드가 테스트 가능하도록 설계되기 때문에 자연스럽게 코드 품질이 향상된다.

TDD는 시간이 지나면서 버그를 줄이고 코드 유지보수를 용이하게 만들어준다.