최범균님의 테스트 주도 개발 시작하기
를 읽고 정리한 내용입니다.
한 번에 코드 구현 → 테스트 → 디버깅 & 코드 수정
→ 테스트 → 디버깅 & 코드 수정
→ 테스트 → 디버깅 & 코드 수정
→ ...
코드 짜는 시간보다 버그 찾는 시간이 더 오래 걸리는 경우도 많았다
서버 켜고.. 테스트하고.. 디비 쿼리 날려보고.. 테스트하고..
배보다 배꼽이 더 크다!
TDD(테스트 주도 개발)는 말 그대로 테스트로부터 시작한다!
1. 테스트를 먼저 하고
2. 구현을 한다.
그 때 드는 생각! '엥.. 구현 코드도 없는데 테스트를 어떻게 하지?'
여기서 테스트를 한다는 것은 테스트코드를 작성한다는 것을 의미한다.
- 테스트 코드를 짜고
- 테스트를 통과시키기 위해 개발을 한다.
완벽하게 구현하기 전(테스트 코드를 다 만족시키기 전) 까지는 src/test/java
소스 폴더에서 작업을 하다, 기능 구현을 완료하면 src/main/java
소스 폴더로 이동시켜 배포 대상에 포함시킨다.
(src/test/java는 배포 대상이 아니므로, 완성되지 않은 코드가 배포되는 것을 방지한다.)
@Test
void plus() {
int result = Calculator.plus(1, 2);
assertEquals(3,result);
assertEquals(5, Calculator.plus(4, 1));
}
다음은 이 간단한 코드를 짜기 위해서 고민해봐야하는 것들이다.
1. 테스트 대상이 될 클래스 이름, 메서드 이름, 파라미터 개수, 리턴 타입을 고민한다.
2. 새로운 객체를 생성할지 아니면 정적 메서드로 구현할지 고민한다.
이 고민 과정은 실제 코드를 설계하는 과정과 유사하다.
다음은 테스트 코드를 짠 후 해야하는 행동들이다.
1. 테스트 코드를 다 짜면, 컴파일 오류를 없애는 데 필요한 클래스와 메서드들을 작성한다.
2. 테스트를 실행해보고 실패하면 이유를 확인하고 구현을 수정해 테스트를 통과시킨다.
3. 그리고 또 다른 새로운 테스트를 추가하고, 과정 1-2를 반복한다.
TDD는 테스트를 먼저 작성하고,
테스트에 실패하면 테스트를 통과시킬 만큼 코드를 추가하는 과정을 반복하면서
점진적으로 기능을 완성해나간다.
레드(테스트) - 그린(코딩) - 리팩터
를 반복한다.
가장 먼저 통과해야할 테스트를 작성한다.
테스트를 통과시킬 만큼만 기능을 구현한다.
아직 추가하지 않은 테스트를 고려해서 구현하지 않는다.
구현을 완료한 뒤에는 리팩토링을 진행한다.
테스트코드가 해당 기능이 온전하게 동작한다는 것을 검증해주기에, 조금 더 과감하게 리팩토링을 진행할 수 있다.
새로운 코드를 추가하거나 기존 코드를 수정하면, 테스트를 통해 해당 코드가 올바른지 바로 확인 가능하다.