워밍업 클럽 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 스타일 따르기
댓글을 작성해보세요.