IT/기초 지식

TDD(Test Driven Development)

개발자 두더지 2023. 3. 21. 20:31
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

 

TDD(Test Driven Development)란?


 한 줄로 설명하자면, Clean Code that works을 구현하기 위해 테스트를 실행하면서 코드를 완성시켜가는 방법이다. 

 

 

TDD(Test Driven Development)의 방법


 아래의 그림과 같이 3개 요소가 포함된 사이클을 계속해서 반복해나가면서 TDD를 실현해나간다. 세 개의 요소는 다음과 같다.

  • Red : 테스트의 실패
  • Green : 테스트의 성공
  • Refactor  : 리팩터링 실시

 기본적으로 사이클은 (1~6)을 반복해서 실행하며, 코딩해나간다.

1. 작성하고자하는 코드의 목표를 생각한다.

2. 그 목표를 달성할 수 있는 테스트 코드를 쓴다.

3. 2에서 쓴 코드를 실행하여 실패시킨다(RED).

4. 목적한 코드를 쓴다(테스트를 성공시키기 위한 코드).

5. 테스트를 성공시킨다(Green).

6. 테스트는 성공하는 것을 전제 조건으로 계속해서 리팩터링해나간다(Refactor).

 

목표를 생각하는 방법

 각각의 목표를 상세하게 분리하여 To-Do 리스트를 만든다. 목표를 결정하는 관건은 크게 두 가지가 있다.

1) 제일 중요한 것을 맨 처음에 실시

2) 테스트가 간단한 것부터 실시

 TDD에서는 후자의 테스트가 간단한 것 부터 시작한다. 목적에 맞게 테스트가 제일 쉬운 순서대로 To-Do 리스트를 만드는 것이다. 아래는 그러한 예이다.

(예) 버튼을 클릭한 횟수를 표시한다. 
     그러나 클릭한 횟수가 3의 배수인 경우 "3의 배수"를 표시하고, 
     클릭한 횟수가 100의 배수인 경우 "Great"를 표시한다.

<테스트가 어려운 것>
- 탭한 횟수
- 횟수가 3의 배수인 경우 "3의 배수"
- 횟수가 100의 배수인 경우 "Great"

<테스트가 쉬운 것>
- 표시한다.
- 버튼을 클릭한다.

⇒ 완성한To-Do 리스트

<테스트가 어려운 것>
[ ] 숫자를 문자열로 변환한다.
-- [ ] 1이 입력되면, 문자열인 1로 변환한다.
-- [ ] 2이 입력되면, 문자열인 2로 변환한다.

[ ] 3의 배수가 입력됐을 때,「3의 배수」로 변환한다.
-- [ ] 3의 배수가 입력됐을 때,「3의 배수」로 변환한다.

[ ] 100의 배수가 입력됐을 때,「Great」로 변환한다. 
-- [ ] 100가 입력됐을 때,「Great」로 변환한다.

<테스트가 쉬운 것>
[ ] 표시한다.
[ ] 버튼을 클릭한다.

 

 

테스트의 작성법

 테스트 코드는 기본적으로 준비, 실행, 검증의 코드를 알기 쉽도록 쓴다. 

 

테스트의 실패(RED)

 여기에서는 일부러 테스트를 실패시킨다. 예를 들어 맨 처음의 테스트 함수 내의 검증 내용은 아래와 같이 하고, 실패시킨다.

//준비
//실행
//검증
expect(1,actual)//actual은 실제 출력된 값

 두 번째 실행 횟수 이하는 첫 번째에 작성한 내용에서 각 부분에 맞게 기대한 값으로 변경하여 실행시킨다.

 

목적 코드 작성법

 앞서 실패시킬 때 작성한 테스트 코드를 변경하여 준비, 실행, 검증 3개 부분의 코드를 쓴다. 여기서 중요한 것은 빠르게 코드를 쓰는 것이다. 맨 앞에 기재했듯, TDD는 보다 빠르고 깔끔한 코드를 실현하기 위해서 고려된 방법이기 때문이다. 

 여기서는 코드를 쓰는 이유는 목표를 달성하기 위한 코드를 되도록 빨리 써, 테스트를 Pass 시키는 것이다. 그러므로 To-Do 리스트 1에 관련된 함수의 반환 값은 아래로 OK이다.

void convert(int number){return '1';}

 

리팩터링의 실시(Refactor)

 바로 앞에 빠르게 썼던 코드를 읽기 쉬운 코드로 바꾼다. 예를 들면 다음과 같이 말이다.

void convert(int number){
 return 1;
}

 여기서 TDD의 "움직이는 깔끔한 코드"가 실현된다. 이 단계에서 가장 중요한 것은 테스트를 성공 시킨 상태(Green)이라는 것이다. 즉, 꽤 넓은 영역에 걸쳐 리팩토리를하여 테스트가 실패하는 것은 NG라는 것이다.

 자식 요소의 테스트 코드가 완성된 경우, 부모 요소를 실행한다.

void convert(int number){
 return number.toString();
}

이것으로 To-Do 리스트의 첫 번째가 끝났다.

<테스트가 어려운 것>
[X] 숫자를 문자열로 변환한다.
-- [X] 1이 입력되면, 문자열인 1로 변환한다.
-- [X] 2이 입력되면, 문자열인 2로 변환한다.

[ ] 3의 배수가 입력됐을 때,「3의 배수」로 변환한다.
-- [ ] 3의 배수가 입력됐을 때,「3의 배수」로 변환한다.

[ ] 100의 배수가 입력됐을 때,「Great」로 변환한다. 
-- [ ] 100가 입력됐을 때,「Great」로 변환한다.

<테스트가 쉬운 것>
[ ] 표시한다.
[ ] 버튼을 클릭한다.

참고자료

https://qiita.com/jonson17/items/a6ae52d1cafda83f39a9

728x90