워밍업 클럽 3기 BE 클린코드&테스트 - 3주차 발자국

워밍업 클럽 3기 BE 클린코드&테스트 - 3주차 발자국

🐾 발자국

워밍업 클럽 3기 BE 클린코드 & 테스트 - 3주차를 듣고 작성하는 발자국입니다

이번에 들은 강의 바로 가기


📃 회고

[워밍업 클럽 3주차를 들으며 .. ]

3주차 발자국을 제출하는 걸 깜박한 바보가 있다 ? 🤔

바로 접니다 ...... 바보 ......

강의를 모두 듣고 해야하는게 없는 줄 알고 주말동안 디스코드에 들어가고 있지 않다가

월요일날 발자국을 안썼다는 사실이 갑자기 떠올랐습니다

워밍업클럽 완주 조건은 발자국을 모두 작성하는 것이다보니깐 완주는 못하겠다 생각하고 있었는데

완주 유예기간이 생겨서 후다닥 3주차 발자국을 작성하게 되었답니다 🙌

3주차는 Day11 미션과 Persistence Layer / Business Layer / Presentation Layer 로 나눠서 각 영역별로

본격적인 테스트코드에 대해서 배우는 주였습니다.

사실 실무에서 테스트코드를 짜야지 짜야지 말만 하고 못짠 이유가 테스트가 어렵다라는 편견때문이였는데

강의를 듣고 테스트 코드를 어떻게 짜야하는지 감이 잡히고 나니깐 테스트 코드가 겁먹을 게 아니구나 라는 생각이 들었습니다.


📺 강의 내용 정리

섹션6 레이어 아키텍처와 테스트

  • 사용자 요청을 세 개의 레이어 (Presentation Layer / Business Layer / Persistence Layer ) 로 나누어서 처리하자

  • 레이어를 구분하는 이유는 관심사의 분리를 위해서

  • 레이어에 따라 관심사를 분리하면 책임을 나누고 유지보수하기 용이해진다.

  • A + B 면 AB, BA, C 중 무엇이 될지 혹은 이 외의 것이 될 지 예측하기 정말 어렵다. 그렇기 때문에 통합 테스트가 필요하다.

  • 통합테스트는 여러 모듈이 협력하는 기능을 통합적으로 검증하는 테스트

 

섹션6 Persistence Layer

  • DB 와 통신해서 데이터를 저장하는 계층 (Repository)

@ActiveProfiles("test")
@DataJpaTest // Jpa 관련 빈들만 주입해준다
class ProductRepositoryTest {

    @Autowired
    private ProductRepository productRepository;

    @DisplayName("원하는 판매상태를 가진 상품들을 조회한다.")
    @Test
    void findAllBySellingStatusIn() {
        // given
        Product product1 = Product.builder()
                .productNumber("001")
                .type(HANDMADE)
                .sellingStatus(SELLING)
                .name("아메리카노")
                .price(4000)
                .build();

        Product product2 = Product.builder()
                .productNumber("002")
                .type(HANDMADE)
                .sellingStatus(HOLD)
                .name("카페라떼")
                .price(4500)
                .build();

        Product product3 = Product.builder()
                .productNumber("003")
                .type(HANDMADE)
                .sellingStatus(STOP_SELLING)
                .name("팥빙수")
                .price(7000)
                .build();
        productRepository.saveAll(List.of(product1, product2, product3));

        // when
        List<Product> products = productRepository.findAllBySellingStatusIn(List.of(SELLING, HOLD));

        //then
        assertThat(products).hasSize(2)
                .extracting("productNumber", "name", "sellingStatus")
                .containsExactlyInAnyOrder(
                        tuple("001", "아메리카노", SELLING),
                        tuple("002", "카페라떼", HOLD)
                );
    }
}
  • PersistenceLayer 의 코드 예시

  • @ActiveProfiles 로 실행된 환경을 지정

  • 예시 데이터들을 저장해주고 (product1, product2, product3) 해당 데이터들이 잘 저장되었는지 확인

    • hasSize : size 가 일치하는지 확인하는 메서드

    • extracting : 가져올 컬럼을 설정

    • containsExactlyInAnyOrder : 값들이 일치하는지 확인

 

섹션6 Business Layer

  • 비즈니스 로직을 구현하는 계층 (Service)

  • Persistence Layer 와의 상호작용으로 로직을 전개

@DisplayName("주문번호 리스트를 받아 주문을 생성한다.")
@Test
void createOrder() {
     // given
     LocalDateTime registeredDateTime = LocalDateTime.now();
 
     Product product1 = createProduct(HANDMADE, "001", 1000);
     Product product2 = createProduct(HANDMADE, "002", 3000);
     Product product3 = createProduct(HANDMADE, "003", 5000);
     productRepository.saveAll(List.of(product1, product2, product3));
 
     OrderCreateRequest request = OrderCreateRequest.builder()
          .productNumbers(List.of("001", "002"))
          .build();
 
     // when
     OrderResponse orderResponse = orderService.createOrder(request, registeredDateTime);
 
     //then
     assertThat(orderResponse.getId()).isNotNull();
     assertThat(orderResponse)
          .extracting("registeredDateTime", "totalPrice")
          .contains(registeredDateTime, 4000);
     assertThat(orderResponse.getProducts()).hasSize(2)
          .extracting("productNumber", "price")
          .containsExactlyInAnyOrder(
               tuple("001", 1000),
               tuple("002", 3000)
     );
}
  • Service 내의 메서드가 정상적으로 작동하는지 검증

     

 

섹션6 Presentation Layer

  • 외부 세계의 요청을 가장 먼저 받는 계층

  • 파라미터에 대한 최소한 검증을 수행


미션

DAY11 미션 - 단위 테스트 작성하기

 

내용

  • 3개 이상의 서로 다른 클래스 & 총 7개 이상의 테스트 작성

  • 무엇을 테스트하고자 했는지를 잘 나타낸 @DisplayName 작성

  • BDD 스타일 따르기

 

https://inf.run/CBsAt

댓글을 작성해보세요.

채널톡 아이콘