테스트 케이스
- 특정 기능 또는 시나리오를 테스트하기 위한 지침이 포함된 문서
- 테스트 케이스는 테스트를 수행하는 데 필요한 모든 정보를 제공하며, 테스트의 목적, 입력 데이터, 예상 결과 등을 명확하게 정의합니다.
테스트 케이스를 작성하는 것 자체가 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에서 가장 중요한 원칙은 ‘최소한의 코드’를 작성하여 ‘최소 단위 테스트를 통과’시켜 ‘점진적으로 코드’를 확장해 나아가는 것을 추구합니다.
또한, 처음부터 많은 로직의 코드를 작성하여 복잡성을 만들어 내기보다는 ‘점진적으로 확장해 나아가며 견고한 코드를 작성해 나아가는 것을 추구합니다.
1. 시간과 노력
2. 설계에 대한 이해
3. 복잡한 시나리오의 테스트
4. 변동이 많은 요구사항
테스트 시나리오
- 테스트 시나리오란 개발자가 작성하는 시나리오로 원하는 기능이 어떻게 동작해야 하는지를 명세하는 것을 의미합니다.
- 테스트 케이스는 개별적인 테스트 단위로써, 특정 입력에 대한 기대된 출력을 확인하는 역할을 합니다.

1. 요구사항 명세화
2. 테스트 케이스 작성
3. 테스트 수행
4. 코드 구현
5. 테스트 확인
6. 리팩토링
BDD에서는 Given, When, Then이라는 구조를 사용하여 요구사항과 기능에 대해 테스트 시나리오를 정의합니다.
1. Given(=주어진 환경)
ex) “사용자가 페이지에 접속해 있는 상황에서“
2. When(= 행위)
ex) “사용자 아이디 필드에 ‘adjh54’을 입력하고 비밀번호 필드에 ‘12345’를 입력하고 ‘로그인’ 버튼을 누르면”
3. Then(= 기대결과)
ex) “로그인이 성공하고 메인 페이지로 이동한다”
최종적으로 다음과 같은 테스트 시나리오가 나오게 됩니다.
- Given: 사용자가 페이지에 접속해 있는 상황에서
- When: 사용자 아이디 필드에 ‘adjh54’을 입력하고 비밀번호 필드에 ‘12345’를 입력하고 ‘로그인’ 버튼을 누르면
- Then: 로그인이 성공하고 메인 페이지로 이동한다
TDD와 BDD의 가장 큰 차이점은 아래와 같습니다.
TDD의 테스트 케이스
- ‘기능’을 확인하기 위한 목적으로 작성을 합니다.
- ex) 계산기 기능을 만들었다고 가정하였을 때, add 함수의 파라미터로 1과 1이 들어갔을 경우 2의 값이 나오는지에 대해 확인합니다.
BDD의 테스트 케이스
- 시나리오를 주체로 한 ‘행위’를 확인하기 위한 관점에서 작성을 합니다.
- ex) 계산기 기능을 만들었다고 가정하였을 때, 사용자가 ‘1’ 버튼을 클릭하고 ‘+’ 버튼을 클릭하고 ‘1’ 버튼을 클릭했을 때 화면상에 ‘2’가 표시가 되는지를 확인합니다.
위에서 언급했듯이 BDD는 TDD에 파생된 개념 중 하나입니다. 그렇기에 선택이 아닌 서로 간은 상호 보완적인 관계입니다.
TDD의 관점
- TDD에서 보기 어려운 ‘유저 시나리오’ 관점을 확인할 수 있습니다.
BDD의 관점
- BDD에서 보기 어려운 TDD 테스트 케이스를 통해 모듈들을 테스트 커버리지를 극복이 가능합니다.

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

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