본문 바로가기
개발진행목록/게시판 서비스

[JPA로 게시판 만들기] TDD, BDD 란

by o3oppp 2025. 1. 23.

시작하기 전에

TDD, BDD 등 테스트 코드 작성 관련 얘기를 주변에서 많이 들었다. 강의를 들으며 진행한 것 외에 스스로 생각하며 진행해본적이 없기 때문에 진행해보았다. 구현한 테스트 코드 설명에 앞서 TDD와 BDD가 무엇인지 먼저 이해하고 시작하기로 하였다.


TDD(테스트 주도 개발)

Test Driven Development의 약자로 테스트가 개발을 주도한다는 개념으로 사용된다. TDD는 테스트를 먼저 만들고 테스트를 통과하기 위한 행동들이 모두 개발을 주도하는 것을 목표로 한다. TDD에서는 보통 개발이 끝난 후 테스트를 하는 과정과 다르게 테스트 코드를 먼저 만들고 테스트 코드를 통과시키기 위해 개발코드를 만들어가면서 개발을 진행한다. 추가로 TDD의 결과물이 단위테스트일 뿐 TDD와 단위테스트는 목적이 다르다.

TDD의 두가지 규칙

  1. 오직 자동화된 테스트가 실패한 경우에만 새로운 코드를 작성
  2. 중복 제거

TDD 예시

public class Calculator{
  public int plus(int a, int b){
    return 0;
  }
}

public class CalculatorTest{
  Calculator calc = new Calculator();

  @Test // 테스트 실패
  void plus(){
    int a = 10;
    int b = 20;
    int result = calc.plus(a,b);
    assertEquals(result, a+b);
  }
  
  @Test // 컴파일 에러
  void minus(){
    int a = 10;
    int b = 20;
    int result = calc.minus(a,b);
    assertEquals(result, a-b);
  }
}
  • 먼저 실패하는 테스트 코드를 작성 : 테스트 코드를 돌려 실패가 뜨는 것을 확인한다. 컴파일 조차 안될 수 있다.
public class Calculator{
  public int plus(int a, int b){
    return a+b;
  }
  public int minus(int a, int b){
    return a-b;
  }
}

public class CalculatorTest{
  Calculator calc = new Calculator();

  @Test
  void plus(){
    int a = 10;
    int b = 20;
    int result = calc.plus(a,b);
    assertEquals(result, a+b);
  }
  
  @Test
  void minus(){
    int a = 10;
    int b = 20;
    int result = calc.minus(a,b);
    assertEquals(result, a-b);
  }
}
  • 테스트 코드를 성공하기 위한 실제 코드를 작성 : 좋은 코드를 고민하지 않고, 테스트 코드가 통과하기만 하면 된다.
  • 중복 코드 제거, 일반화 등의 리팩토링을 수행 : 리팩토링을 수행하여 중복을 제거한다.

BDD(행위 주도 개발)

Behavior Driven Development의 약자로 TDD에서 따왔기 때문에 TDD추구하는 가치가 크게 다르지 않다. BDD는 애플리케이션이 어떻게 행동해야 하는지에 대한 공통된 이해를 구성하는 방법이다. BDD는 주로 시스템 동작의 행위를 기반으로 하며, 개발자의 관점에서 시스템이 어떻게 작동해야 하는지에 초첨을 맞춘다.

BDD에서 주로 사용하는 디자인 패턴

  1. Given
    •    테스트를 위해 주어진 상태
    •    테스트 대상에게 주어진 조건
    •    테스트가 동작하기 위해 주어진 환경
  2. When
    •    테스트 대상에게 가해진 어떠한 상태
    •    테스트 대상에게 주어진 어떠한 조건
    •    테스트 대상의 상태를 변경시키기 위한 환경
  3. Then
    •    과정의 결과

BDD 예시

public class Calculator{
  public int plus(int a, int b){
    return a+b;
  }
}
public class CalculatorTest{
  Calculator calc = new Calculator();

  @Test
  void plus(){
    //given
    int a = 10;
    int b = 20;

    //when
    int result = calc.plus(a,b);

    //then
    assertEquals(result, a+b);
  }
}
  1. Given : a=10, b=20 으로 주어진 상태일 때
  2. When : 두 변수를 더하는 plus 메서드에 a와 b를 넣은 결과값이
  3. Then : a+b와 같다

실제 개발단계에 들어간다면 TDD, BDD 등 하나만 선택해서 적용하는 것이 아닌, 서로 상호 보완적인 관계로 필요한 부분에 같이 사용될 수 있다.