본문 바로가기

Spring Boot

테스트 주도 개발(TDD)

개념만 보고 가자

 

테스트 주도 개발(Test-Driven Development, TDD)은 테스트 코드를 먼저 작성하고 이를 만족시키는 실제 구현 코드를 작성하는 개발 방법론임

 

1. 요구사항 이해

기능 요청(Feature Request) 또는 버그 리포트를 읽고 그 요구사항이 뭘 의미하는지 이해해야함

2.테스트 작성

 - 이해한 요구사항을 바탕으로 단위 테스트 코드 작성

 - 실제 코드는 작성되지 않았기 때문에 테스트 실패

 - 이때 핫 리로딩 환경이 설정되어 있다면, 테스트가 자동 실행됨

3. 기능 구현

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

 - 모든 테스트를 실행하고 모두 통과(Green)해야 다음 단계로 넘어갈 수 있음

 - 실패한다면 반복함

4. 리팩토링(코드 정리)

 - 기능이 정상동작하면 코드를 정리하고 개선함

 - 중복 제거, 네이밍 개선, 구조 최적화 등 테스트를 모두 통과해야함

5. 반복

 - 다음 기능 요청 또는 다음 버그로 돌아가서 1단계부터 반복(Rinse, lather and repeat)함

 

Spring은 구조적으로 TDD를 실현하기 매우 적합한 프레임워크라고 함. POJO기반 설계, 의존성 주입(DI), 컨테이너 독립성, 테스트 유틸리티 제공 등

 

 

단위 테스트의 용이성

Spring에선 객체간의 결합도를 낮추는 구조(IoC/DI)를 제공해서 각 객체를 독립적으로 생성하고 테스트할 수 있는 환경을 지원함

 

POJO

 - Spring 컴포넌트들은 컨테이너 없이도 단순 자바 객체(POJO)로 실행이 가능하기 때문에

 - JUnit과 같은 일반적인 테스트 프레임워크로 쉽게 단위 테스트 수행 가능

의존성 주입(DI)

테스트 대상 객체가 내부에서 직접 의존 객체를 생성하지 않고 외부에서 주입받기 때문에 Mockito와 같은 Mocking도구와의 결합이 용이함

@Mock private MemberRepository memberRepository;
@InjectMocks private MemberService memberService;

 

 

통합 테스트 지원

1. @SpringBootTest 어노테이션

Spring Boot 기반 애플리케이션 전체를 컨텍스트 수준에서 테스트할 수 있게 해줌.

실제 애플리케이션 구동 환경과 유사한 조건에서 수행할 수 있다.

 

2. TestContext 프레임워크

Spring 자체적으로 TestContext Framework를 내장하고 있으며 이는 테스트 전후의 컨텍스트 초기화, 트랜잭션 처리, 설정 클래스 로딩 등을 자동화해줌

 

 

테스트 중심 개발을 유도하는 설계 철학

 - POJO 기반 클래스 - > 별도의 컨테이너 없이도 테스트 가능

 - DI를 통한 구성 - > 객체간 결합도 감소 - > 단위 테스트가 용이함

 - 설정과 환경 분리 - > 테스트 대상 코드의 독립성이 확보됨

 - 모듈화된 아키텍처 - > 책임과 기능 분리 - > 테스트 대상 명확하게 구분 가능

 

* 객체지향 설계 원칙(SOLID, DRY, SRP, SoC 등)은 Spring이 구조적으로 구현할 수 있도록 지원하는 핵심 개념임.

DI(의존성 주입), AOP(관점 지향), 계층형 아키텍처 등은 이 원칙들을 실현하는 수단이 된다.