TDD VS BDD

Luke·2024년 4월 21일

TestCode

목록 보기
1/5
post-thumbnail

TDD란?

  • TDD(Test-Driven-Development)란 소프트웨어 개발 방법론 중 하나로 ‘테스트 주도 개발’을 의미합니다.
  • 코드를 작성하기 전에 ‘테스트 케이스’를 작성하고 테스트를 통과하기 위해 그에 맞는 기능을 작성합니다.
  • 테스트 중에 실패한 코드에 대해서는 수정해 나아가면서 ‘반복적인 테스트’를 통한 개발을 하는 작업을 의미합니다.

테스트 케이스

  • 특정 기능 또는 시나리오를 테스트하기 위한 지침이 포함된 문서
  • 테스트 케이스는 테스트를 수행하는 데 필요한 모든 정보를 제공하며, 테스트의 목적, 입력 데이터, 예상 결과 등을 명확하게 정의합니다.

테스트 케이스를 작성하는 것 자체가 TDD를 의미하는 것일까?

  • 테스크 케이스를 작성하는걱 자체만으로는 TDD라고 할수 없습니다.
  • 테스트 케이스를 우선 작성하고 그 다음 코드를 입력하는 것이 TDD의 과정이지만, 코드를 우선 작성한 후에 테스를 케이스를 작성할수도 있기때문입니다.

TDD 수행 과정

1. Write Test : 테스트 코드 작성

  • 구현하려는 기능이나 동작을 검증할 테스트 코드를 작성합니다.
  • 해당 단계에서 원하는 동작이 ‘실패하는 테스트 케이스’를 작성합니다.

ex) add() 함수를 구성할 예정이고, 두 개의 숫자를 더하는 기능이 잘 수행되는지에 대해 테스트 코드를 작성합니다.

2. Test Fails : 실패하는 테스트 실행

  • 작성한 테스트를 실행하여 기대한 대로 동작하지 않는 것을 확인합니다.
  • 이때는 실패하는 테스트가 예상대로 동작하는 것입니다.

ex) 아직 코드가 없기에 실패하는 테스트가 실행됩니다.

3. Write Code: 코드 작성

  • 실패하는 테스트를 통과할 수 있는 최소한의 코드를 작성합니다.
  • 이 단계에서는 테스트를 통과하는 것이 목표입니다.

ex) add() 함수를 작성하여 두 개의 숫자를 더하는 코드를 작성합니다.

4. Test Passes: 테스트 통과

  • 작성한 코드가 테스트를 통과하는지 확인합니다.
  • 테스트가 성공적으로 통과되면 기능이 제대로 구현된 것으로 간주합니다.

ex) 작성한 코드를 기반으로 두 개의 숫자를 더하는 테스트에 성공하는지 확인하며, 해당 단계에서는 반드시 테스트가 통과되어야 합니다.

5. Refactor: 리펙토링

  • 이전 과정에서 테스트를 통과한 코드를 개선하고 중복을 제거하며 코드의 가독성을 높이는 등의 작업을 수행합니다.
  • 기능의 동작에는 영향을 주지 않으며, 코드의 품질을 개선하는 단계입니다.
  • 작성한 코드를 개선하고 가독성과 유지보수성을 향상하기 위해 리팩토링 작업을 수행합니다.

ex) 코드를 읽기 더 쉽고 유지보수 하기가 더 쉽도록 재 구성합니다.

결론적으로, TDD에서 가장 중요한 원칙은 ‘최소한의 코드’를 작성하여 ‘최소 단위 테스트를 통과’시켜 ‘점진적으로 코드’를 확장해 나아가는 것을 추구합니다.
또한, 처음부터 많은 로직의 코드를 작성하여 복잡성을 만들어 내기보다는 ‘점진적으로 확장해 나아가며 견고한 코드를 작성해 나아가는 것을 추구합니다.


TDD의 한계

1. 시간과 노력

  • TDD는 코드를 작성하기 전에 테스트 케이스를 먼저 작성해야 하므로, 이로 인해 개발 시간이 늘어날 수 있습니다. 또한, TDD를 위해선 기존에 비해 더 많은 코드를 작성해야 하므로 더 많은 노력이 필요합니다.

2. 설계에 대한 이해

  • 테스트 케이스를 작성하기 위해서는 개발자가 설계에 대한 깊은 이해를 가지고 있어야 합니다. 그렇지 않으면, 테스트 케이스가 미흡하게 작성될 수 있습니다.

3. 복잡한 시나리오의 테스트

  • 복잡한 시나리오나 UI, 성능 테스트 등은 TDD로 테스트하기 어려울 수 있습니다.

4. 변동이 많은 요구사항

  • 요구사항이 자주 바뀌는 경우, 테스트 케이스를 계속해서 수정해야 하는 상황이 발생할 수 있습니다.

BDD란?

  • BDD(Behavior Driven Development)는 소프트웨어 개발론 중 하나로 ‘행동 주도’개발 방법론을 의미합니다.
  • TDD에서 파생된 개발방법론으로 TDD에서 기능 중심의 ‘테스트 케이스’를 작성하는데 한계를 극복하기 위해 등장하게 되었습니다.
  • BDD에서는 ‘사용자의 행위’를 기반으로 ‘사용자 시나리오’를 구성하여 ‘테스트 케이스’를 작성하고 개발을 진행하는 방식입니다.
  • 즉, ‘사용자의 행위’를 정의하고 행위에 따라 개발해 나아가는 방식을 의미합니다.
  • 여기서 ‘사용자 행위’는 기획자가 작성한 ‘요구사항’이나 ‘기획서’에 적혀 있는 내용 자체를 의미합니다.

테스트 시나리오

  • 테스트 시나리오란 개발자가 작성하는 시나리오로 원하는 기능이 어떻게 동작해야 하는지를 명세하는 것을 의미합니다.
  • 테스트 케이스는 개별적인 테스트 단위로써, 특정 입력에 대한 기대된 출력을 확인하는 역할을 합니다.

BDD 수행 과정

1. 요구사항 명세화

  • 비즈니스 요구사항이나 기능 요구사항을 이해하고 분석하여 사용자의 행동을 중심으로 한 '시나리오를 작성'합니다.
  • 이 과정에서는 도메인 특정 언어를 사용하여 비개발자도 이해할 수 있는 방식으로 시나리오를 명세화합니다.

2. 테스트 케이스 작성

  • 작성된 시나리오를 기반으로 테스트 케이스를 작성합니다.
  • 이때 테스트 케이스는 사용자의 행동 중심으로 작성되어야 합니다.

3. 테스트 수행

  • 작성된 테스트 케이스를 수행합니다.
  • 이때 테스트는 실패하게 됩니다. 왜냐하면 테스트 케이스에 따른 기능이 아직 구현되지 않았기 때문입니다.

4. 코드 구현

  • 테스트 케이스를 통과시킬 수 있는 최소한의 코드를 구현합니다.

5. 테스트 확인

  • 구현된 코드가 테스트 케이스를 통과하는지 확인합니다.
  • 통과하지 못할 경우 코드를 수정하여 테스트를 통과하도록 합니다.

6. 리팩토링

  • 코드를 개선하여 가독성을 높이고, 중복을 제거하며, 코드의 품질을 향상합니다.

BDD 구조

BDD에서는 Given, When, Then이라는 구조를 사용하여 요구사항과 기능에 대해 테스트 시나리오를 정의합니다.

1. Given(=주어진 환경)

  • ‘사용자 행위’를 수행하기 위해 주어진 ‘환경’에 대해 서술합니다.
  • 해당 단계에서는 시스템이나 애플리케이션의 초기 상태, 환경, 입력 등에 대해 서술합니다.

ex) “사용자가 페이지에 접속해 있는 상황에서“

2. When(= 행위)

  • 실제 사용자 행위에 대해서 서술합니다.
  • 해당 단계에서는 시스템이나 애플리케이션 내에 발생하는 특정 조건이나 이벤트들에 대해 서술합니다.

ex) “사용자 아이디 필드에 ‘adjh54’을 입력하고 비밀번호 필드에 ‘12345’를 입력하고 ‘로그인’ 버튼을 누르면”

3. Then(= 기대결과)

  • 행위에 따른 기대결과를 서술합니다.
  • 해당 단계에서는 예상되는 동작이 실제로 발생하는지 확인하고 기대한 결과가 나오는지에 대한 검증을 수행하여 서술합니다.

ex) “로그인이 성공하고 메인 페이지로 이동한다”

최종적으로 다음과 같은 테스트 시나리오가 나오게 됩니다.

  • Given: 사용자가 페이지에 접속해 있는 상황에서
  • When: 사용자 아이디 필드에 ‘adjh54’을 입력하고 비밀번호 필드에 ‘12345’를 입력하고 ‘로그인’ 버튼을 누르면
  • Then: 로그인이 성공하고 메인 페이지로 이동한다

TDD와 BDD의 상호보완적 관계

TDD와 BDD의 가장 큰 차이점은 아래와 같습니다.

TDD의 테스트 케이스

  • ‘기능’을 확인하기 위한 목적으로 작성을 합니다.
  • ex) 계산기 기능을 만들었다고 가정하였을 때, add 함수의 파라미터로 1과 1이 들어갔을 경우 2의 값이 나오는지에 대해 확인합니다.

BDD의 테스트 케이스

  • 시나리오를 주체로 한 ‘행위’를 확인하기 위한 관점에서 작성을 합니다.
  • ex) 계산기 기능을 만들었다고 가정하였을 때, 사용자가 ‘1’ 버튼을 클릭하고 ‘+’ 버튼을 클릭하고 ‘1’ 버튼을 클릭했을 때 화면상에 ‘2’가 표시가 되는지를 확인합니다.

위에서 언급했듯이 BDD는 TDD에 파생된 개념 중 하나입니다. 그렇기에 선택이 아닌 서로 간은 상호 보완적인 관계입니다.

TDD의 관점

  • TDD에서 보기 어려운 ‘유저 시나리오’ 관점을 확인할 수 있습니다.

BDD의 관점

  • BDD에서 보기 어려운 TDD 테스트 케이스를 통해 모듈들을 테스트 커버리지를 극복이 가능합니다.

아래는 TDD와 BDD의 동작 사이클입니다.

  • BDD가 수행되기 위해서는 TDD 사이클이 함께 더해지는 구조로 이루어집니다.
  • BDD의 사이클이 통과해야 하고 TDD도 함께 통과를 해야 하나의 테스트 구조가 완료가 됩니다.


정리

분류TDD (테스트 주도 개발)BDD (행동 주도 개발)
정의테스트가 개발의 중심이 되는 개발 방식. 먼저 테스트를 작성하고 그 테스트를 통과하는 코드를 작성함으로써 소프트웨어의 품질을 높이는 방법론행동을 기반으로 테스트를 작성하는 방법론. 사용자의 행동이나 시스템의 반응을 기반으로 테스트를 작성함으로써 소프트웨어의 품질을 높이고 사용자 중심의 개발을 가능하게 함
목적기능 동작의 검증, 코드의 품질 향상서비스 유저 시나리오 동작의 검증, 사용자 중심의 개발
설계 중심제공할 모듈의 기능 중심 설계서비스 사용자 행위 중심 설계
테스트 코드 설계 주체모듈 사양 문서(개발자가 작성)서비스 기획서(서비스 기획자가 작성)
적합한 프로젝트모듈/라이브러리 프로젝트서비스 프로젝트
장점코드의 결함을 미리 찾아내고, 코드의 품질을 보장. 코드의 리팩토링과 유지보수가 쉬움사용자의 관점에서 테스트를 작성하여 사용자 중심의 개발을 가능하게 함
단점테스트 작성에 시간이 많이 소요될 수 있음사용자 행동에 대한 정확한 이해가 필요함

참고

https://adjh54.tistory.com/305#2
https://tv.kakao.com/channel/3693125/cliplink/414004682

0개의 댓글