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 CANCELLEDDELIVERED와CANCELLED는 최종 상태로, 다른 상태로 전이 불가SHIPPED에서는CANCELLED로 전이 불가 (이미 배송됨)
4. 적용되는 Mutator
이 코드에는 여러 Mutator가 동시에 적용됨
| 메서드 | 적용되는 Mutator | 변이 예시 |
|---|---|---|
createOrder | Math, Negate Conditionals | quantity * unitPrice → quantity / unitPrice |
applyDiscount | Math, Negate Conditionals | totalPrice - (totalPrice * rate) → totalPrice + (...) |
updateOrderStatus | Negate Conditionals, Void Method Call | setStatus() 호출 제거 |
checkInventory | Conditionals 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 -PpractiveMutation Score 확인
target/pit-reports/com.example.mutation.practive/OrderService.java.html을 열어
생존한 돌연변이가 있는지 확인
⚠️
Warning
90% 미만이라면 빨간색 라인을 확인하고, 해당 변이를 잡을 수 있는 테스트를 추가
참고 답안과 비교
OrderServiceStrongTest.java를 열어 자신의 테스트와 비교
Last updated on