[인프런 워밍업클럽 백엔드 스터디 2기] 3주차 발자국
3주차 학습내용
Practical Testing : 실용적인 테스트 가이드
강의를 학습하며 작성한 내용입니다.
단위 테스트
테스트케이스 나누기
해피 케이스 (모든 게 올바르게 동작)
예외 케이스
테스트 하기 어려운 영역 구분하고 분리하기 (외부로 분리할수록 테스트 가능한 코드가 많아짐)
외부에서 들어오는 값에 의존하는 코드 (현재 날짜/시간, 랜덤 값)
외부에 영향을 주는 코드 (표준 출력, 메시지 발송)
TDD: Test Driven Development
: 프로덕션 코드보다 테스트 코드를 먼저 작성해서 테스트가 구현 과정을 주도하도록 하는 개발 방법
- 복잡도가 낮은(유지보수가 쉬운), 테스트 가능한 코드로 구현할 수 있다.
- 쉽게 발견하기 어려운 예외상황을 놓치지 않게 해준다.
- 과감한 리팩토링이 가능하다.
테스트는 [ ]다
DisplayName을 섬세하게
@DisplayName("음료 1개를 추가")
보다는 @Display("음료를 1개 추가하면 주문 목록에 담긴다.")
처럼
테스트의 행위에 대한 결과까지 기술하기
"~테스트"라는 표현 지양하기, 문장으로 작성
도메인 용어를 사용해서 좀 더 추상화된 내용 담기
테스트의 현상 중점으로 기술하지 말 것
주문을 생성하면 실패한다(x)
주문을 생성할 수 없다.
BDD (Behavior Dirven Development) 스타일로 작성하기
: TDD에서 파생된 개발 방법
필수 단위 테스트에 집중하기 보다 시나리오에 기반한 "테스트 케이스" 자체에 집중한다.
given / when / then
💻미션 - 테스트코드 작성
minsweeper에 대한 테스트 코드를 작성했봤는데 사실 어떤 부분을 어떻게 테스트해야할지 감이 오지 않았다. 간단한 게임이라도 내부 동작에 대해 작성할 테스트 코드가 많다는 건 알겠는데 @DisplayName과 bdd스타일 따르는 것만 신경 쓰고 정작 단위 테스트의 본질적인 목적을 잊고 작성한 것 같아서 아쉽다. 강의를 다 들은 후 다시 강의 내용을 가이드삼아 찬찬희 케이스를 나눠 작성해보고 싶다. 그리고 studycafe에 대해서도 단위 테스트 작성을 연습해봐야겠다.
Spring&JPA 기반 테스트
Persistence Layer
repository layer에 대한 테스트
@DataJpaTest 사용 가능 -> rollback 관련 작업 설정 필요 없음
Business Layer
재고라는 개념 도입
재고 차감 예외 테스트
assertThatThrownBy(() -> stock.deductQuantity(quantity))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("차감할 재고 수량이 없습니다.");
Stock에서 체크 후 예외를 던지는 것과 OrderService에서 체크 후 예외를 던지는 것은 다르다. (같은 상황이지만 발생할 수 있는 상황이 다르기 때문에 메시지도 다르다.) Service에서는 메시지가 사용자단까지 갈 수 있기 때문에 사용자 친화적인 메시지로 작성한다.
Presentation Layer
외부 세계의 요청을 가장 먼저 받는 계층
파라미터에 대한 최소한의 검증을 수행한다.
MockMvc테스트 -> @WebMvcTest 사용
전체 빈 컨텍스를 다 띄우는 게 아니라 컨트롤러 레이어만 떼서 사용
직렬화하기 위해 ObjectMapper 주입
💬3주차 회고
테스트 코드의 중요성은 알지만 제대로 작성해 본 적은 없어서 하나씩 따라하면서 적용시켜봐야 겠다는 생각으로 강의를 들었다. 듣다보니 테스트 코드 작성에 대한 내용 말고도 아직 스프링과 자바에서도 익숙하지 않은 개념, 헷갈리는 내용들이 많다는 걸 깨달았다. 특히 Layer별 테스트 부분은 강의가 길고 내용이 많아 힘들었지만, 테스트 작성에 대한 부분 말고도 스프링에서의 Validation 적용에 대해 다시 한 번 공부할 수 있어서 좋았다. 리팩토링 강의에서 계속 들었던 책임 분리가 테스트 코드 작성에서도 중요하다는 걸 느꼈다.그리고 앞으로 작은 프로젝트를 하더라도 기능과 서비스의 확장을 염두한 개발을 해야겠다고 생각했다.
댓글을 작성해보세요.