TDD란 기능을 검증하는 테스트 코드를 먼저 작성하고 테스트를 통과시키기 위해 개발을 진행하는 것은 의미한다.
개발자가 코드를 조금씩 수정할 때마다 브라우저부터 DB까지 전 범위를 테스트해야 하는 것은 아니며 출시 전에 DB와 연동할 때 사용한 쿼리만 확인해서도 안된다.
테스트 범위에 따른 테스트 종류는 다음과 같이 세 가지로 나눠볼 수 있다.
기능 테스트
기능 테스트는 사용자가 직접 사용하는 웹 크라우저나 모바일 앱부터 시작해서 데이터베이스나 외부 서비스에 이르기까지 모든 구성 요소를 하나로 엮어서 진행한다.
QA 조직에서 수행하는 테스트가 주로 기능 테스트이다.
⇒ 테스트 상황을 만들어내기 위해 많은 노력이 필요하다. DB나 캐시 서버와 같은 연동 대상을 구성해야 하고, 웹 서버를 구동하거나 모바일 앱을 폰에 설치해야할 수도 있다.
통합 테스트
통합 테스트는 시스템의 각 구성 요소가 올바르게 연동되는지 확인하다. 기능 테스트가 사용자 입장에서 테스트하는 데 반해 통합 테스트는 소프트웨어의 코드를 직접 테스트한다.
⇒ DB 연결, 소켓 통신, 스프링 컨테이너 초기화와 같이 테스트 실행 속도를 느리게 만드는 요인이 많다.
단위 테스트
단위 테스트는 개별 코드나 컴포넌트가 기대한대로 동작하는지 확인한다. 단위 테스트는 한 클래스나 한 메서드와 같은 작은 범위를 테스트한다. 일부 의존 대상은 스텁이나 모의 객체 등을 이용해서 대역으로 대체한다.
⇒ 단위 테스트는 테스트 코드를 빼면 따로 준비할 것이 없다.
테스트케이스는 항상 예외값을 기준으로 작성하도록 하자.
⇒ 내가 의도한 조건이나 예외가 잘 발생하는지 확인!
테스트하기 어려운 영역을 잘 분리하자.
관측할 때마다 다른 값에 의존하는 코드(함수에 들어오는 값에 의존)
⇒ 현재 날짜/시간, 랜덤 값, 전역 변수/함수, 사용자 입력 등
Layer별 테스트코드 작성
Repository
복잡한 where 절에 대해 제대로 날아갈 것인가에 대해 테스트를 작성해야하고, query를 구현하는 기술이 달라지는 경우(리팩토링 등)에 확장성을 고려해야한다.
Repository Layer 테스트는 Spring 서버를 띄우므로 통합 테스트이긴 하지만, 단위 테스트 성격을 많이 띈다.
Service
Service Layer 테스트는 Repository Layer까지 통합하여 테스트
Controller
Mock(가짜) 객체를 사용해 스프링 MVC 동작을 재현