TDD 테스트 예시
로그인 서비스(유저이름, 암호) 제작 시 필요한 테스트는?
- 단위 테스트
- 유저 이름 및 암호 필드에 대한 lenth limit 테스트
- 통합 테스트
- 스프링 프레임워크 설정이 올바른지
- SQL 쿼리문이 맞는지
- DB 트랜잭션이 잘 동작하는지
- 기능 테스트(브라우저 테스트)
- 유저가 로그인 버튼을 누르면 홈페이지로 이동하는지
- 단위-통합-기능 순서대로 피라미드 구성됨. 단위테스트 부분이 잘 동작하지 않는다면 윗단계인 기능테스트등에서도 문제가 있을 가능성이 많음
단위 테스트
- 테스팅 시간 비용 절감
- 새로운 기능 추가 시 수시로 빠르게 테스트 가능
- 리팩토링 시 안정성 확보
- 코드에 대한 문서가 될 수 있음
TDD 개발 주기
개발 주기란

red : 실패하는 테스트코드
green : 테스트 성공시키기 위한 실제 코드 작성
blue : 중복 코드 제거, 개선 하는 부분
주기 예시
※ 생년월일을 입력받으면, 나이를 출력하는 프로그램
1. 목표 = 2015, 2022 → 7살
2. 실패 테스트 설계 → 사실, 실제로 test설계시 service를 가져와서 사용할텐데, test를 처음 짤때는 service 코드가 없을테니까 실패할 수 밖에 없음
3. 테스트를 통과할 수 있는 프로그램을 작성(service)
4. 성공 여부 확인
5. 성공했다면 새로운 테스트 추가, 아니면 다시 리팩토링
TDD 개념
given-when-then
- given
- 테스트에서 구체화하고자 하는 행동을 시작하기전, 상태 설명
- when
- 구체화하고자 하는 행동
- ex) 서비스의 join을 호출해서 실제 회원가입하기
- then
- 특정 행동으로 인해 발생할 것이라고 예상되는 변화에 대한 설명
- ex) 방금 저장된 유저의 이름이 예상하는것과 같은지 확인
test code 이점
- 하지 않을때, tomcat 실행하고, postman으로 요청하고, 이상하면 중지해서 오류찾는등의 과정이 필요없음
- 튼튼한 객체 지향적 코드 생산
- 재설계 시간 단축
- 디버깅 시간 단축
- 테스트 문서 대체 가능(테스트 코드만 봐도 이해되니까)
- 추가 구현 용이함
TDD 라이브러리
- spring-boot-starter-test dependencies 추가
- JUnit
- assert 메서드로 테스트 케이스 수행결과 판별
- AssertJ
- Hamcrest
- Mockito
- 단위 테스트 작성시, 필요한 객체를 실제로 만들기 어려운경우 가짜 객체 만들어줌
- MockMvc
- 서버에 배포하지않고, 테스트용 mvc 환경을 만들어서 요청/전송/응답 기능을 제공해줌
- 생성하고, 요청정보 입력하고, 응답값을 Expect를 이요해 테스트