※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
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」로 변환한다.
<테스트가 쉬운 것>
[ ] 표시한다.
[ ] 버튼을 클릭한다.
참고자료
'IT > 기초 지식' 카테고리의 다른 글
[SQL] MySQL의 GROUP BY 완전 이해하기 (0) | 2023.04.08 |
---|---|
[Jest] 프론트엔드 테스트에서 비동기 처리 다루기 (0) | 2023.03.23 |
[DDD] DDD를 실천하기 위한 안내서 (개념/도입편) (1) | 2023.03.18 |
[DDD] DDD를 실천하기 위한 안내서 (리포지터리편) (0) | 2023.03.15 |
JPA(Java Presistence API)와 ORM(Object-Relational Mapping) (0) | 2023.03.14 |