PromleeBlog
sitemap
aboutMe

posting thumbnail
요구사항을 테스트 코드로 표현하기 - Spring Boot로 시작하는 TDD 3편
Expressing Requirements in Test Code - TDD with Spring Boot Part 3

📅

🚀

들어가기 전에 🔗

지난 시간에는 Spring Boot에서 테스트 환경을 설정하는 방법을 배웠습니다.
TDD의 핵심은
코드를 작성하기 전에 무엇을 만들지 먼저 정의하는 것
입니다.

많은 분이 이 단계에서 막막함을 느낍니다.
"도대체 테스트 코드에 뭘 적어야 하지?"라는 고민이 들기 때문입니다.
오늘은 요구사항을 분석하고, 이를 코드로 옮기는 과정을 아주 상세하게 알아보겠습니다.

🚀

테스트 코드로 요구사항 정리하기 🔗

개발을 시작할 때 가장 먼저 해야 할 일은
무엇을 만들지
정하는 것입니다.
우리가 만들 예제는 간단한
상품 등록 기능
입니다.
기획자에게 다음과 같은 요구사항을 받았다고 가정해 봅시다.
상품을 등록할 수 있어야 한다. 상품 이름과 가격은 필수이며, 가격은 0원보다 커야 한다.
이 문장을 그대로 두고 코딩을 시작하면 놓치는 부분이 생길 수 있습니다.
그래서 TDD에서는 이것을 테스트 케이스 목록으로 먼저 정리합니다.


이렇게 목록을 만드는 과정은 알고리즘 문제를 풀 때
입력값과 출력값의 범위를 확인하는 과정
과 같습니다.
입력이 무엇이고 출력이 무엇인지 정의해야 올바른 함수를 만들 수 있는 것과 같은 이치입니다.

🚀

실패하는 테스트 작성 (Red) 🔗

이제 위에서 정리한 내용을 실제 자바 코드로 옮겨보겠습니다.
아직 기능 코드는 하나도 없지만, 테스트 코드부터 작성합니다.
이것이 바로 TDD의 첫 번째 단계인
Red(실패)
단계입니다.

테스트 메서드 네이밍 기준 🔗

테스트 클래스를 만들 때 가장 고민되는 것이 메서드 이름입니다.
영어권에서는 should_RegisterProduct_When_ValidInput 같은 긴 이름을 쓰기도 합니다.
하지만 한국 개발자들 사이에서는
한글 메서드 이름
을 적극적으로 사용하는 추세입니다.

JUnit 5부터는 한글 메서드 명을 완벽하게 지원합니다.
또한 @DisplayName 어노테이션을 사용하면 테스트의 의도를 문장으로 적을 수 있어, 테스트 결과 보고서를 읽기 편해집니다.

Given-When-Then 패턴 🔗

테스트 코드는 보통
Given-When-Then
3단 구성을 따릅니다.
이것은 상태 머신(State Machine)의 원리와 비슷합니다.
초기 상태(Given)에서 어떤 동작(When)을 하면 결과 상태(Then)가 된다는 논리적인 흐름입니다.

다음과 같이 테스트 코드를 작성해 보겠습니다.
tdd_study라는 프로젝트 내에 product 패키지를 만들고, 그 안에 ProductServiceTest라는 테스트 클래스를 생성합니다.
src/test/java/com/example/tdd_study/product/ProductServiceTest.java
package com.example.tdd_study.product;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
 
class ProductServiceTest {
 
    @Test
    @DisplayName("상품 등록이 성공해야 한다")
    void 상품_등록_성공() {
        // Given: 테스트를 위한 준비
        String name = "아메리카노";
        int price = 4500;
        ProductService productService = new ProductService();
 
        // When: 실제 테스트할 동작 수행
        productService.register(name, price);
 
        // Then: 결과 검증 (다음 편에서 다룸)
    }
}

왜 실패해야 할까요? 🔗

위 코드를 IntelliJ나 Eclipse에 복사해 넣으면 어떻게 될까요?
당연히
빨간 글씨(컴파일 에러)
이 뜹니다.
컴파일 에러 발생
컴파일 에러 발생
ProductService라는 클래스도 없고, register라는 메서드도 없기 때문입니다.

TDD 초보자들은 이
빨간 글씨
를 보고 당황해서 ProductService 클래스를 먼저 만들러 갑니다.
하지만 이
빨간 글씨
를 보는 것이 목표입니다.

이 실패는 다음을 의미합니다.

즉, 테스트 코드가 우리가 구현해야 할
설계도(Interface)
역할을 대신해 준 것입니다.

🚀

결론 🔗

오늘은 요구사항을 분석하고 실패하는 테스트 코드를 작성해 보았습니다.


지금 우리 앞에는 빨간색 에러가 가득합니다.
다음 시간에는 이 빨간 불을 초록 불(Green)로 바꾸는
최소 구현
방법에 대해 알아보겠습니다.

참고 🔗