작은 코드 단위로 독립적으로 검증하는 테스트 (클래스 or 메서드)
검증 속도가 빠르고, 안정적이다.
예시로 음료 여러 잔을 한번에 담는 기능을 단위테스트 해보자
기능을 구현 할 때는 아직 드러나지 않은 요구 사항이 있는가 항상 고민해야한다
테스트 케이스 세분화하기
1. 해피케이스 : 성공하는 케이스
cafeKiosk.add(americano,2);
//해피케이스
assertThat(cafeKiosk.getBeverages().get(0)).isEqualTo(americano);
assertThat(cafeKiosk.getBeverages().get(1)).isEqualTo(americano);
2. 예외케이스 : 실패하는 케이스
//예외 케이스
assertThatThrownBy(()-> cafeKiosk.add(americano,0))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("음료는 한잔 이상 주문하실 수 있습니다.");
해당 케이스를 테스트 할때는, 경계값 테스트가 중요하다.
ex) 3이상일 경우 통과라는 조건이 있다.
-> 해피케이스는 : 3 검증
-> 예외케이스는 : 2 검증
테스트하기 어려운 영역을 구분하고 분리하기
요구조건 : 운영시간( 10: 00 ~ 22: 00 ) 외에는 주문을 생성할 수 없다.
public Order createOrder() {
LocalDateTime currentDateTime = LocalDateTime.now();
LocalTime currentTime = currentDateTime.toLocalTime();
if(currentTime.isBefore(OPEN_TIME) || currentTime.isAfter(CLOSE_TIME)) {
throw new IllegalArgumentException("운영 시간이 아닙니다.");
}
return new Order(LocalDateTime.now(), beverages);
}
- LocalDateTime 으로 인해 시간에 따라 성공하기도 하고, 실패하기도 함. 즉, 23:00시에 TEST할 경우에는 실패하게 된다.
public Order createOrder(LocalDateTime currentDateTime) {
..생략
}
- 테스트가 어려운 영역을 외부에서 받을 수 있도록 파라미터로 변경
- 즉, 테스트 코드 상에서 원하는 값을 넣어줄 수 있도록 설계를 변경한다
- 테스트하기 어려운 영역을 외부로 분리할수록 테스트 가능한 코드는 많아진다.
테스트 하기 어려운 영역
- 관측할 떄마다 다른 값에 의존하는 코드
- 현재날짜/시간, 랜덤값, 전역 변수/함수, 사용자 입력 등
- 외부 세계에 영향을 주는 코드
- 표준 출력, 메세지 발송, 데이터베이스 기록하기 등
테스트 하기 쉬운 영역 ( 순수 함수)
- 같은 입력에는 항상 같은 결과
- 외부 세상과 단절된 형태
- 테스트 하기 쉬운 코드
'TDD' 카테고리의 다른 글
Presentation Layer의 테스트 (0) | 2024.11.24 |
---|---|
레이어드 아키텍처(Layered Architecture) 와 테스트 (0) | 2024.11.18 |
테스트는 [문서]다 (1) | 2024.11.15 |
TDD가 정확히 무엇일까? (0) | 2024.11.11 |
테스트는 왜 필요할까? (0) | 2024.11.09 |