• TDD

    2025. 1. 23.

    by. hyunji1109

    TDD

    • 테스트 주도 개발(Test-Driven Development)의 약자
    • 개발자가 코드를 작성하기 전에 테스트를 먼저 작성하는 소프트웨어 개발 방법론

     

     

    TDD의 3단계 사이클

     

    출처:https://sattlub123.medium.com

     

    • RED
      • 실패하는 테스트를 작성
      • 아직 구현되지 않은 기능을 테스트로 정의
    • GREEN
      • 테스트를 통과시키기 위해 최소한의 코드를 작성
      • 구현은 간단하게
      • 테스트를 통과하는 것에만 집중
    • REFACTOR
      • 코드를 리팩토링
      • 테스트가 성공한 상태에서 코드를 개선하고 최적화

     

     

    장점

    • 설계 품질 향상
      • 테스트를 먼저 작성하므로 자연스럽게 테스트 가능한 구조와 명확한 설계
    • 코드 안정성 증가
      • 기능 추가 시 기존 테스트가 깨지지 않으면 기존 코드가 안전하게 유지
    • 빠른 피드백 제공
      • 개발 초기 단계에서 결함을 발견할 가능성이 높아져 문제 해결 비용이 줄어듦
    • 유지보수성 개선
      • 테스트가 변경의 안전망 역할을 하므로 자신감 있게 코드를 수정
    • 문서 역할 수행
      • 테스트는 코드의 동작을 명시적으로 보여주므로 자연스럽게 실행 가능한 문서

     

    단점

    • 초기 개발 속도 저하
      • 테스트 작성 시간 때문에 초기에 느리게 느껴짐
    • 잘못된 테스트 작성 가능성
      • 초기에 테스트 설계가 잘못되면 오히려 혼란을 초래

     

     

    예제

    간단한 계산기(Calculator) 구현

     

    요구사항

    • 두 숫자의 합을 계산하는 기능을 제공한다.
    • 두 숫자의 곱을 계산하는 기능을 제공한다.

     

    1) RED

    실패하는 테스트 작성

    import static org.junit.jupiter.api.Assertions.*;
    import org.junit.jupiter.api.Test;
    
    class CalculatorTest {
    
        @Test
        void testAddition() {
            Calculator calculator = new Calculator();
            int result = calculator.add(2, 3);
            assertEquals(5, result);  // 기대값: 5
        }
    
        @Test
        void testMultiplication() {
            Calculator calculator = new Calculator();
            int result = calculator.multiply(2, 3);
            assertEquals(6, result);  // 기대값: 6
        }
    }

    => 실패

     

    2) GREEN

    테스트를 통과시키기 위한 최소한의 코드 작성

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

    => 성공

     

    3) REFACTOR

    • 코드 개선
    • 복잡한 코드라면 이 단계에서 정리하거나 최적화
    • 공통 로직을 분리하거나 불필요한 코드를 제거

     

    언제 TDD를 사용하면 좋은가?

    • 복잡한 비즈니스 로직
      • 계산, 조건, 상태 변화 등 테스트가 필요한 로직이 많을 때
    • 장기적인 유지보수가 필요한 프로젝트
      • 기존 코드와의 통합에서 안정성이 중요한 경우

     

    더보기

    프로젝트에서 실제로 사용하면서 느낀 장점 중 하나는 문서 역할을 한다는 점이다. 테스트 코드만 봐도 기능의 의도와 동작을 쉽게 이해할 수 있어 새로운 개발자가 프로젝트에 합류하거나 과거 코드를 수정할 때 도움이 될것같다.

    처음에는 TDD를 작성하는것이 익숙하지 않고 시간도 더 걸렸지만 장기적으로 더 좋은 코드와 유지보성을 보장해준다. 명확한 요구사항 없이 개발하는 초기 단계에서 오히려 비효율적인것 같다. 상황에 맞게 유연하게 활용해야할 것 같다.

    'CS > 웹개발' 카테고리의 다른 글

    JPA의 지연 로딩(Lazy Loading), 즉시 로딩(Eager Loading)  (0) 2025.03.16
    데이터 빠르게 찾기 - 인덱스 설정하기  (0) 2025.03.12
    Docker  (0) 2025.01.20
    JPA N+1 문제  (0) 2025.01.19
    CI/CD  (1) 2025.01.16

    댓글