테스트 코드 작성 순서
- 쉬운 경우에서 어려운 경우로 진행
- 예외적인 경우에서 정상인 경우로 진행
초반에 복잡한 테스트부터 시작하면 안되는 이유
초반부터 다양한 조합을 검사하는 복잡한 상황을 테스트로 추가하면 해당 테스트를 통과시키기 위해 한 번에 구현해야 할 코드가 많아진다.
구현하기 쉬운 테스트부터 시작하기
가장 구현하기 쉬운 경우부터 시작하면 빠르게 테스트를 통과시킬 수 있다. 보통 수 분에서 십여분 이내에 구현을 완료해서 테스트를 통과시킬 수 있을 만큼 쉬운 것을 선택한다.
예외상황을 먼저 테스트해야 하는 이유
예외상황을 전혀 고려하지 않은 코드에 예외 상황을 반영하려면 코드의 구조를 뒤집거나 코드 중간에 예외 상황을 처리하기 위해 조건문을 중복해서 추가하는 일이 벌어진다.
완급조절
- 정해진 값을 리턴
- 값 비교를 이용해서 정해진 값을 리턴
- 다양한 테스트를 추가하면서 구현을 일반화
뻔한 구현이라도 위 단계를 거쳐서 연습하는 것과 바로 구현하는 것에는 차이가 있다. 단계적으로 나아가는 연습을 하지 않는 개발자는 조금만 구현이 떠오르지 않아도 진전을 이루지 못하고 막혀 있거나 한 번에 많은 코드를 구현하려고 시도하다 구현에 실패하게 된다. 중요한 것은 테스트 - 구현 - 확인이다.
구현코드에 대해서 분리하고 생각해내며 코드를 작성하는 것을 연습해야한다. 한번에 많은 구현을 하려는 것은 버그를 야기한다.
지속적인 리팩토링
테스트를 통과한 뒤에는 적당한 후보가 보이면 리팩토링을 진행한다.
테스트 작성 순서 연습
매달 비용을 지불해야 사용할 수 있는 유료 서비스를 가정한다.
- 서비스를 사용하려면 매달 1만원을 선불로 납부한다. 납부일 기준으로 한 달 뒤가 서비스 만료일이 된다.
- 2개월 이상 요금을 납부할 수 있다.
- 10만원을 납부하면 서비스를 1년 제공한다.
다음 테스트를 추가하기 전에 리팩토링
메서드의 파라미터 개수가 세 개 이상이면 객체로 바꿔 한 개로 줄이는 것을 고려해야한다.
시작이 안 될 때는 단언부터 고민
테스트 코드를 작성하다 보면 시작이 잘 안될때가 있다. 이럴땐 검증하는 코드부터 장성하기 시작하면 도움이 된다.
구현이 막히면
TDD를 하다 구현이 막힐 때가 있다. 과감하게 코드를 지우고 미련없이 다시 시작한다. 어떤 순서로 테스트 코드를 작성했는지 돌이켜보고 순서를 바꿔서 다시 진행한다.
- 쉬운 테스트, 예외적인 테스트
- 완급조절