Skip to Content
Suffering builds character
아카이브26.mutation Testing돌연변이 테스트5. 실습

5. 실습

1. 학습 목표

  • 여러 Mutator가 동시에 적용되는 현실적인 비즈니스 로직에서 돌연변이 테스트를 수행
  • 스켈레톤 테스트를 기반으로 남은 테스트를 작성하고, 90% 이상의 Mutation Score를 달성

2. 관련 파일

파일역할
practive/OrderItem.java주문 항목 데이터 모델
practive/Order.java주문 데이터 모델
practive/OrderStatus.java주문 상태 열거형
practive/OrderService.java비즈니스 로직 (핵심 대상)
practive/OrderServiceSkeletonTest.java스켈레톤 테스트 (직접 작성)
practive/OrderServiceStrongTest.java참고 답안 (90%+ Mutation Score)

3. 비즈니스 로직 개요

OrderService의 4가지 메서드

OrderService.java
public class OrderService { // 1. 주문 생성: 유효성 검증 + 가격 계산 public Order createOrder(List<OrderItem> items, String customerType); // 2. 할인 적용: 고객 유형별 할인율 public double applyDiscount(Order order); // 3. 상태 변경: 유효한 전이만 허용 public void updateOrderStatus(Order order, OrderStatus newStatus); // 4. 재고 확인: 수량 범위 검증 public boolean checkInventory(OrderItem item); }

고객 유형별 할인율

고객 유형할인율
"vip"20%
"premium"10%
"regular"0% (할인 없음)

주문 상태 전이 규칙

주문 상태 전이 규칙
CREATED → CONFIRMED → SHIPPED → DELIVERED ↓ ↓ CANCELLED CANCELLED
  • DELIVERED와 CANCELLED는 최종 상태로, 다른 상태로 전이 불가
  • SHIPPED에서는 CANCELLED로 전이 불가 (이미 배송됨)

4. 적용되는 Mutator

이 코드에는 여러 Mutator가 동시에 적용됨

메서드적용되는 Mutator변이 예시
createOrderMath, Negate Conditionalsquantity * unitPrice → quantity / unitPrice
applyDiscountMath, Negate ConditionalstotalPrice - (totalPrice * rate) → totalPrice + (...)
updateOrderStatusNegate Conditionals, Void Method CallsetStatus() 호출 제거
checkInventoryConditionals Boundary, Return Values>= 1 → > 1, true → false

5. 실습 진행

스켈레톤 테스트 확인

OrderServiceSkeletonTest.java를 열어보기
각 테스트 메서드에 TODO 주석과 힌트가 있음:

OrderServiceSkeletonTest.java
@Test @DisplayName("createOrder: 정상적인 주문 생성") void createOrder_validItems() { // TODO: OrderItem 목록을 만들고 createOrder를 호출하세요. // 힌트: 반환된 Order의 totalPrice가 각 항목의 (quantity * unitPrice) 합계와 같은지 검증하세요. // 힌트: Order의 상태가 CREATED인지 확인하세요. }

직접 테스트 작성

TODO 주석을 참고하여 각 테스트를 직접 구현

💡
Tip
  • 경계값 정확히 테스트 (수량 0, 재고 상한 1000 등)
  • 반환값 구체적으로 검증 (assertEquals로 정확한 금액 비교)
  • 부수 효과 검증 (updateOrderStatus 후 getStatus() 확인)
  • 예외 경로 검증 (assertThrows로 유효하지 않은 입력 테스트)

Pitest 실행

terminal
mvn org.pitest:pitest-maven:mutationCoverage -Ppractive

Mutation Score 확인

target/pit-reports/com.example.mutation.practive/OrderService.java.html을 열어 생존한 돌연변이가 있는지 확인

⚠️
Warning

90% 미만이라면 빨간색 라인을 확인하고, 해당 변이를 잡을 수 있는 테스트를 추가

참고 답안과 비교

OrderServiceStrongTest.java를 열어 자신의 테스트와 비교

Last updated on