-
[appling] Domain 테스트코드 작성appling 프로젝트 2024. 9. 4. 13:28728x90반응형
🔴 Domain
🟠 jacoco 수정
tasks.jacocoTestCoverageVerification { violationRules { rule { enabled = true element = "CLASS" // 라인 커버리지를 최소한 80% limit { counter = "LINE" value = "COVEREDRATIO" minimum = "1.00".toBigDecimal() } // 브랜치 커버리지를 최소한 90% limit { counter = "BRANCH" value = "COVEREDRATIO" minimum = "1.00".toBigDecimal() } // 빈 줄을 제외한 코드의 라인수를 최대 200라인으로 제한합니다. limit { counter = "LINE" value = "TOTALCOUNT" maximum = "200".toBigDecimal() } excludes = listOf( "*.ApplingApplication*" , "*.global.*" ) } } }
기존에
*.domain.*
부분을 제거하고 jacoco에서 테스트 되도록 수정했다.🟠 doamin 테스트를 하는 이유
domain 테스트를 진행하는 이유는 domain에 서비스 로직들이 있기 때문이다. 서비스 로직을 서비스에 두지 않고 도메인으로 뺀 이유는 또 뭘까?
도메인에 서비스 로직을 넣어두면 장점으로는
- 도메인을 가지고 로직을 짤때 재활용성이 매우 높다.
- 도메인에는 db나 api 통신이 없기 때문에 도메인에 있는 로직의 경우 도메인 자체로 테스트가 가능하다.
- 통합 테스트나 인수 테스트가 필요 없이 유닛 테스트로만 테스트가 가능하여 굉장히 빠르고 가볍다.
이런 장점들이 있기 때문에 domain에 로직을 두는 것이 좋다고 생각하는 편이고 그렇게 짜려고 한다.
🟢 테스트 하려는 도메인
@Entity @Table(name = "product") @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @Getter public class ProductEntity extends CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long productId; private String productName; private int productWeight; private String productType; private ProductStatus productStatus; private int productPrice; private int productStock; public void update(PutProductRequest putProductRequest) { this.productName = putProductRequest.getProductName(); this.productWeight = putProductRequest.getProductWeight(); this.productType = putProductRequest.getProductType(); this.productPrice = putProductRequest.getProductPrice(); this.productStock = putProductRequest.getProductStock(); this.productStatus = putProductRequest.getProductStatus(); } }
이전에 작성했던 ProductEntity의 update()를 테스트 하려고 한다.
🟢 Test
class ProductEntityTest { @Test @DisplayName("상품 업데이트 성공") void update() { //given ProductEntity productEntity = ProductEntity.builder() .productId(1L) .productName("아리수") .productWeight(5) .productType("11과") .productPrice(100_000) .productStock(100) .productStatus(ProductStatus.ON_SALE) .build(); PutProductRequest putProductRequest = PutProductRequest.builder() .productId(1L) .productName("아리수") .productWeight(5) .productType("11과") .productPrice(100_000) .productStock(100) .productStatus(ProductStatus.SOLD_OUT) .build(); //when productEntity.update(putProductRequest); //then Assertions.assertThat(productEntity.getProductStatus()).isEqualTo(ProductStatus.SOLD_OUT); } }
해당 로직에 따로 실패하는 경우는 처리하지 않아 성공하는 테스트만 작성했다.
원래 테스트 코드는 실패 케이스가 많을 수록 좋지만 이번 글은 테스트 코드에 관한 글 보다는 도메인을 통해 유닛 테스트를 진행하는 것을 학습하려는 내용이므로 간단하게 작성하자!
728x90반응형'appling 프로젝트' 카테고리의 다른 글
[appling] Controller 추가하기 (Api Annotation 추가, Swagger 적용) (1) 2024.09.08 [appling] Querydsl 적용하기 (with. SpringBoot 3.3, build.gradle.kts) (0) 2024.09.05 [appling] Product 수정 (0) 2024.09.04 [appling] poroduct 등록 (0) 2024.09.04 [appling] 코드품질 관련 설정 (jacoco) (0) 2024.09.01