Spring REST Docs
·
TDD
API 개발을 완료하고, 엔드포인트를 공유해주기 위해 스펙을 정의한다.- 해당 스펙을 정의하는 툴에는 여러가지가 있지만 그 중 하나가Spring Rest Docs 이다.  Spring REST Docs테스트 코드를 통한 API 문서 자동화 도구API 명세를 문서로 만들고 외부에 제공함으로써 협업을 원할하게 한다.기본적으로 AsciiDoc을 사용하여 문서를 작성한다. REST Docs 와 Swagger 를 비교REST Docs장점테스트를 통과해야 문서가 만들어진다. (신뢰도가 높다)프로덕션 코드에 비침투적이다.단점코드 양이 많다,설정이 어렵다.Swagger장점적용이 쉽다.문서에서 바로 API 호출을 수행해 볼 수 있다.단점프로덕션 코드에 침투적이다.테스트와 무관하기 때문에 신뢰도가 떨어질 수 있다.  RE..
더 나은 테스트를 작성하기 위한 고민
·
TDD
한 문단에 한 주제!하나의 테스트는 하나의 주제를 가져야 한다.ex) 테스트 코드에서 반복문이나, 분기문 같은 논리 구조 등이 들어가지 않는 형태로 만들어야한다. 만약 테스트에 로직이 들어갔다면, 테스트 케이스가 두 개 이상이다 라는 것을 방증 하기때문에, 별도의 테스트 케이스로 분류해야한다. 완벽하게 제어하기테스트를 하기 위한 환경을 조성할 때 완벽하게 제어할 수 있어야 한다.public Order createOrder() { LocalDateTime currentDateTime = LocalDateTime.now(); LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || cu..
Mockito로 Stubbing 하기
·
TDD
Stubbing 데이터를 메일로 전송해주는 기능을 Mocking 테스트를 해보자! 왜냐면 메일 mailSend 같은 테스트는 매번 외부로 보내서 테스트 해야하는데, 이런 경우 테스트가 힘들 수 있다. 따라서, mailSendClient 컴포넌트의 sendEmail를 Mocking 처리해보자이걸 Mocking 으로 Stubbing 한다고 말한다.@MockBeanprivate MailSendClient mailSendClient;@DisplayName("결제완료 주문들을 조회하여 매출 통계 메일을 전송한다.")@Testvoid sendOrderStatisticsMail() {// given//products 생성 및 저장 .. 생략 productRepository.saveAll(products);//생성한 ..
응답 예외처리와 책임 분리
·
TDD
컨트롤러 응답성공했을 때, 그냥 데이터를 보내는 것 보단, 일정한 형식을 통해 항상 동일하게 보내주는 것이 좋다.public class ApiResponse { private int code; private HttpStatus status; private String message; private T data; public static ApiResponse of(HttpStatus httpStatus,T data) { return of(httpStatus,httpStatus.name(),data); }}//controller단 @PostMapping("/api/v1/product/new")public ApiResponse createdProduct(@Vali..
Presentation Layer의 테스트
·
TDD
Presentation Layer외부 세계 요청을 가장 먼저 받는 계층파라미터에 대한 최소한의 검증을 수행한다. 그런데 Presentation Layer 를 검증하려면 Business Layer가 필요하고 → Business Layer는 또 Persistence Layer가 필요하다. 나는 파라미터 검증 하나만 하려 했는데 준비 해야 할 사항이 너무 많아져 버린다. 이때 사용할 수 있는게 바로 Mock(가짜)이다. MockMockMvcMock(가짜) 객체를 사용해 스프링 MVC 동작을 재현할 수 있는 테스트 프레임워크 CQRSCommand/ Query의 분리 : Command는 CUD , Query는 Read를 의미한다.보통의 경우 Read의 빈도가 훨씬 많다. (90% 이상)그런데 Read에 트래픽이 ..
레이어드 아키텍처(Layered Architecture) 와 테스트
·
TDD
A라는 모듈과 b 라는 모듈이 있다. 결과를 어떻게 예측할까? 단위 테스트로는 커버하기 어려운 부분이 생기게 된다.그래서 통합 테스트가 필요하다.  통합 테스트여러 모듈이 협력하는 기능을 통합적으로 검증하는 테스트일반적으로 작은 범위 단위 테스트만으로는 기능 전체의 신롸성을 보장할 수 없다.풍부한 단위 테스트 & 큰 기능 단위를 검증하는 통합 테스트 레이어드 아키텍처Spring MVC 기반에서 가장 많이 사용되는 아키텍처사용자의 요청이 왔을 때 각 레이어별로 접근한다. 관심사를 분리해서 책임을 나누고 유지보수하기 용이하게 만든다. Persistence LayerData Access 의 역할비즈니스 가공 로직이 포함되어서는 안된다. Data에 대한 CRUD에만 집중한 레이어단위 테스트에 가깝다.  Busi..
테스트는 [문서]다
·
TDD
테스트는 문서이기도 하다. 다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완한다. 어느 한 사람이 과거에 경험했던 고민의 결과물을 테스트를 녹여낸다.  이 테스트를 팀 차원으로 승격시켜 모두의 자원으로 사용할 수 있다.  DisplayName을 섬세하게@DisplayName("음료 1개를 추가하면 주문 목록에 담긴다.")명사의 나열보다 문장으로 작성a이면 b이다a이면 b가 아니고 c다.~ 테스트 (X) 테스트 행위의 결과까지 기술하기음료 1개를 추가할 수 있다. (X)음료1개를 추가하면 주문 목록에 담긴다. (O)도메인 용어를 사용하여 한층 추상화된 내용을 담기특정 시간 이전에 주문을 생성하면 실패한다. (X)영업 시작 시간 이전에는 주문을 생성할 수 없다.(o)테스트 현상을 중점..
TDD가 정확히 무엇일까?
·
TDD
- test Driven Development프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 방법론  1단계 : Red //TDD 1단계 : RED @Test void test(){ //요구사항잉 반영된 test 구문 작성 assertThat(tatalPrice).isEqualTo(8500); } 2단계 : GREEN public int calculateTotalPrice() { return 8500; } 3단계 : REFACTOR//3단계 : 리팩토링 (여러번도 가능)public int calculateTotalPrice() { return beverages.stream() .mapToInt(Beverage::..