Spring boot

[Spring Boot] TDD (Test-Driven Development)

beginner-in-coding 2025. 4. 22. 17:54

📋 Spring Boot TDD 기본 흐름

TDD는 항상 3단계 사이클:

  1. Red – 실패하는 테스트 작성 (처음엔 무조건 실패해야 정상)
  2. Green – 테스트를 통과시키기 위한 최소한의 코드 작성
  3. Refactor – 코드를 예쁘게 다듬고 최적화 (테스트는 계속 통과해야 함)

즉,
테스트 먼저 → 코드 작성 → 리팩터링


✨ Spring Boot TDD 실습 예시

예를 들어, "회원가입" 기능을 만든다고 가정

1. 실패하는 테스트 먼저 만들기 (Red)

// src/test/java/com/example/demo/MemberServiceTest.java
package com.example.demo;

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

class MemberServiceTest {

    private MemberService memberService = new MemberService();

    @Test
    void 회원가입_성공() {
        // given
        String name = "Alice";

        // when
        Member member = memberService.register(name);

        // then
        assertThat(member.getName()).isEqualTo("Alice");
    }
}
  • MemberService와 register() 아직 없음 → 당연히 테스트 실패함.

2. 테스트 통과시키는 최소한 코드 작성 (Green)

// src/main/java/com/example/demo/MemberService.java
package com.example.demo;

public class MemberService {

    public Member register(String name) {
        Member member = new Member();
        member.setName(name);
        return member;
    }
}
// src/main/java/com/example/demo/Member.java
package com.example.demo;

public class Member {

    private String name;

    // getter, setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
 
  • 이제 테스트 통과함 ✅

3. 리팩터링 (Refactor)

  • 혹시라도 중복 제거
  • 객체 생성 깔끔하게 정리
  • 테스트 메서드 이름 정리 등

📦 Spring Boot에서 TDD 기본 세팅

  • 의존성 추가 (build.gradle):
dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
  • 테스트 라이브러리:
    • JUnit5 (Spring Boot 기본)
    • AssertJ (더 읽기 좋은 assertion)
    • Mockito (Mocking할 때)
    • Spring Test (통합 테스트할 때)

🚀 TDD를 어디에 쓰냐?

  • Service 계층 테스트 (비즈니스 로직 검증)
  • Repository 계층 테스트 (DB 테스트)
  • Controller 계층 테스트 (API 테스트, @WebMvcTest)
  • 통합 테스트 (@SpringBootTest)

🛠️ 정리

구분방법
단위(Unit) 테스트 @SpringBootTest 없이 클래스만 테스트
통합(Integration) 테스트 @SpringBootTest 사용해서 스프링 환경 띄움
Mock 테스트 @MockBean, Mockito 사용해서 의존성 가짜로 만듦
API 테스트 @WebMvcTest, MockMvc 사용