TDD? BDD?

지니·2022년 1월 23일
1

테스트케이스

테스트케이스의 정의는 다음과 같다.

테스트케이스

  • 본인이 작성한 코드가 예상한 대로 잘 동작하는지 예상되는 값을 부여하여 어플리케이션 빌드 시 동작을 검증하는 것
  • 타겟 코드에 대한 기대 행동을 제공하는 시나리오




TDD (Test Driven Development)

TDD는 테스트 주도 개발의 줄임말로 우선 테스트케이스를 작성한 뒤 해당 기능에 대한 코드를 작성하는 방법이다.
테스트를 먼저 작성하다 보니 기능을 만들기 전에 본인이 만들어야 하는 기능들에 대해 좀 더 명확하게 그릴 수 있다는 장점이 있다.





BDD (Behavior Driven Development)

BDD는 행동 주도 개발의 줄임말로 비즈니스 요구사항에 집중하여 테스트케이스를 작성하는 방법이다.

도대체 이게 무슨 말이지? TDD랑 똑같은거 아닌가?

TDD랑 그렇게 다르지는 않다. BDD 역시 TDD로부터 파생되어 나온 것이다.



BDD가 나오게 된 배경

  • TDD 방식으로 테스트 케이스를 작성하면서 어떤 케이스가 있을지를 생각하면서 작성해야 한다.
  • 흐음 어떤 경우가 있을까??? 아 더 생각나는 케이스가 없는데 누군가가 말해줬으면 좋겠다...
  • 테스트케이스를 상상해서 만드는 것보다 이미 작성된 요구사항이 테스트 케이스가 된다면 부담이 줄어들 것이다.
  • 그렇다면 무작정 테스트 케이스를 코드로 작성하기 보다는 글로 작성해보자!

이렇게 나온 것이 BDD다!



주로 사용하는 BDD 구조

BDD는 테스트 케이스를 작성하는 대신, 동작 작성으로 시작하는 방법으로 TDD의 확장이다. 테스트 케이스를 작성하기에 앞서 문장으로 풀어 써볼 것인데, 아래와 같은 형식을 지킬 것이다.

주어진 환경에서 어떠한 행위를 했을 때 이런 결과가 나올 것이다.

이 문장을 세 부분으로 나눌 수 있겠다.

Given - 주어진 환경에서
When - 어떠한 행위를 했을 때
Then - 이런 결과가 나올 것이다.

이제 한 예시에 적용해볼 것이다.



예시

MyMath라는 클래스를 만들어 Math.pow(double a, double b)와 동일한 결과를 반환하는 함수 pow(double a, double b)를 구현해본다고 가정해볼 것이다.

public class MyMath {
  public static double pow(int a, int b) {
    double result = 1;
    for (int i = 0; i < b; i++) {
      result *= a;
    }
    return result;
  }
}

위의 형식처럼 문장으로 작성한다면 이렇게 작성할 수 있을 것 같다.

a=10, b=3이 준비된 상태에서 MyMath.pow(double a, double b)를 호출하였을 때 Math.pow(10, 3)과 결과가 동일한 1000이 나올 것이다.


이제 요구사항(?)도 작성해봤으니 이를 테스트 코드로 옮기기만 하면 끝이다!

public class TestControllerTest {

  @Test
  void test() {
    // given
    int a = 10;
    int b = 3;

    // when
    double result = MyMath.pow(a, b);

    // then
    assertEquals(result, Math.pow(a, b));
  }
}


본인의 생각

지금까지 Junit5를 이용하여 테스트 코드는 작성해 보았지만 사실 명확하게 TDD였다 혹은 BDD였다고 말하기가 어려울 것 같다고 생각했다. 테스트 코드를 작성하고 기능을 구현한 것이 아니라, 이미 구현된 기능에 대한(혹은 기능을 구현하고 나서) 테스트 코드를 작성하곤 하였다.


사실 머리로는 받아들이겠지만 TDD든 BDD든 정석으로 적용하기에는 어려움이 있을 것이라고 생각한다. 테스트 코드 작성하는 데 테스트 케이스를 생각하는 것부터 시작해서 작성하는데 꽤 오래 걸리는 것 같다. (본인이 초보라서 그럴 수도 있겠지만...) 하지만 테스트 코드 작성 자체는 중요한 역할을 한다는 점 자체는 받아들일 수 있을 것 같다. 예전에 로직 변경하면서 리팩토링하다가 작성해뒀던 테스트 코드 다 터뜨려먹고 일부 기능이 제대로 작동하지 않는 것을 확인하여 급하게 수정한 경험이 있었기 때문이다.


기능 구현 전에 테스트 코드를 작성하든 구현 이후에 작성하든 테스트 코드는 작성하는 습관을 들이자는 것이 결론이다.





Reference
TDD, BDD란?
[Spring Boot] JUnit5 BDDMockito로 알아보는 TDD와 BDD 의 차이 및 BDD 실습

+ 이해한 내용을 바탕으로 작성한 글이니 추가적인 의견 및 정보 있으시다면 댓글로 공유 좀 부탁드립니다!

profile
Coding Duck

1개의 댓글

comment-user-thumbnail
2022년 1월 25일

잘읽었읍니다.

답글 달기