[인프런 워밍업클럽 백엔드 스터디 2기] 3주차 발자국

[인프런 워밍업클럽 백엔드 스터디 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 적용에 대해 다시 한 번 공부할 수 있어서 좋았다. 리팩토링 강의에서 계속 들었던 책임 분리가 테스트 코드 작성에서도 중요하다는 걸 느꼈다.그리고 앞으로 작은 프로젝트를 하더라도 기능과 서비스의 확장을 염두한 개발을 해야겠다고 생각했다.

 

 

 

댓글을 작성해보세요.

채널톡 아이콘