[TDD] What is TDD and BDD?
(본 글은 최수형님의 TDD 강의(https://www.youtube.com/watch?v=L1dtkLeIz-M)를 보고 따로 정리한 내용이다.)
1. TDD(Test Driven Development)의 궁극적 목표
Clean code That works!
작동을 하는 깨끗한 코드를 만들기 위해 TDD를 사용한다.
2. TDD 작성시 주의사항
1. Testable Code를 작성하자.
이 말은 즉 관심사의 분리(SoC)가 필요하다는 것이다.
[ 관심사의 분리 ? ]
프로그램을 하나의 단일 Block으로 작성하지 말고 작은 조각으로 나누어 간단한 개별 작업을 완료할 수 있도록 하는 원칙이다
(즉 긴 복잡한 함수로 작성하지 말고 분리할 것.)
이 원칙을 지키게 될 경우의 기대값으로는 코드가 간결해지고, 작은 조각으로 나누었기에 재사용성이 올라간다는 것을 기대할 수 있다.
간단한 예시로 Int Array가 있는데, 이 배열에서 가장 작은 값과 가장 큰 값을 더하는 함수를 만들었을 때 한개의 함수를 사용하지 말고, 3개의 함수를 만들라는 뜻이다.
(배열 내에서 최솟값을 구하는 함수, 배열 내에서 최댓값을 구하는 함수, 최솟값과 최댓값을 더하는 함수)
2. Test Code에서 나오는 중복적인 코드는 가급적 빨리 지워주는 것이 좋다.
(코드를 지우고, 하나의 변수 혹은 함수로 통일하자.)
3. 특정 컴포넌트에 대한 Test Code를 작성할 때 의도가 잘 나오게 작성해라.
4. 가급적 Test Code를 먼저 작성해라.
3. TDD Cycle
(1) : 일단 테스트 코드를 작성하고, 실패하는 것을 봐라.
(2) : 어떻게든 테스트 코드가 통과할 수 있도록 만들어라. 무슨 수를 써서라도.
(3) : 테스트 코드가 통과되었다면, 그 코드를 이쁘게 리팩토링하자.
TDD를 진행했을 때의 기댓값은 아래와 같이 기대할 수 있다.
- 요구사항을 명확하게 정할 수 있다.
- 원하는 결과값이 무엇인지에 대해서 정확히 알 수 있다.
- Test Code를 작성해 놓으면 이 후 다시 코드를 봤을 때 혹은, 다른 개발자가 코드를 봤을 때 기능 파악에 도움이 된다.
- 증명할 수 있다. => (응 내잘못 아니야, 응 나는 너네가 원하는데로 해줬어.)
- 특정 객체에 대해 변경을 했을 때 오류사항을 빠르게 캐치할 수 있다.
마냥 TDD를 하자 라고 하면 어렵게 느껴질 수 있다.
(테스트 코드를 작성해서 일단 실패를 시키라는데.. 어떻게 시키지?)
이 때 BDD를 생각하면 된다.
BDD란, 행위 주도 개발(Behaivor Driven Development) 로 테스트를 작성하기 어려우면 행위 단위로 생각하여 테스트 코드를 작성하라는 것이다.
예를 들어 게임을 진행하는데, 내 캐릭터가 무기를 들고 있냐 없냐에 따라 행동을 나누면 된다.
- 무기를 들고 있다 : 공격 가능
- 무기를 들고 있지 않다. : 공격은 가능하나 공격력이 1로 고정되어 데미지가 들어감.
아직 내가 TDD를 깊게 적용해보지도 않았고, 알아야할 부분이 많기 때문에 어느정도 알게되면 TDD 작성요령에 대해 작성하도록 하겠다.
빨리 진행중인 개인 프로젝트에 TDD를 적용해보고 싶다.