PHpullh
학습 라이브러리/Java/뮤테이션 테스트

JAVA · 테스트

뮤테이션 테스트

코드를 의도적으로 변경하여 테스트의 품질을 검증하는 뮤테이션 테스트입니다.

테스트고급mutation-testPIT뮤테이션테스트품질

핵심 설명

코드를 의도적으로 변경하여 테스트의 품질을 검증하는 뮤테이션 테스트입니다.

Java code

// PIT 의존성: org.pitest:pitest-maven:1.15+

// 뮤테이션 테스트 개념:
// 1. 원본 코드에 "변이(mutation)"를 주입
// 2. 변이 예: if (a > b) -> if (a >= b), return a+b -> return a-b
// 3. 테스트가 변이를 감지(kill)하면 좋은 테스트
// 4. 감지 못하면(survived) 테스트 부족

// 원본 코드
class Calculator {
    int add(int a, int b) { return a + b; }
    int max(int a, int b) { return a > b ? a : b; }
    boolean isPositive(int n) { return n > 0; }
}

// 테스트
// class CalculatorTest {
//     Calculator calc = new Calculator();
//
//     @Test void testAdd() { assertEquals(5, calc.add(2, 3)); }
//     @Test void testMax() {
//         assertEquals(3, calc.max(3, 1));
//         assertEquals(3, calc.max(1, 3));
//         assertEquals(3, calc.max(3, 3)); // 경계값!
//     }
//     @Test void testIsPositive() {
//         assertTrue(calc.isPositive(1));
//         assertFalse(calc.isPositive(0));   // 경계값!
//         assertFalse(calc.isPositive(-1));
//     }
// }

// 실행: mvn org.pitest:pitest-maven:mutationCoverage

class Main {
    public static void main(String[] args) {
        System.out.println("뮤테이션 종류:");
        System.out.println("- 조건 변이: > -> >=, == -> !=");
        System.out.println("- 수학 변이: + -> -, * -> /");
        System.out.println("- 반환값 변이: return true -> return false");
        System.out.println("- 제거 변이: 메서드 호출 제거");
    }
}

학습 팁

라인 커버리지 100%여도 뮤테이션 테스트에서 살아남는 변이가 있을 수 있습니다. 경계값 테스트가 부족한 경우가 많습니다.

주의할 점

뮤테이션 테스트는 실행 시간이 오래 걸립니다(코드량 * 변이 수만큼). CI에서는 변경된 코드만 대상으로 실행하세요.

자주 묻는 질문

뮤테이션 테스트란 무엇인가요?

코드를 의도적으로 변경하여 테스트의 품질을 검증하는 뮤테이션 테스트입니다.

뮤테이션 테스트 학습 시 주의할 점은 무엇인가요?

뮤테이션 테스트는 실행 시간이 오래 걸립니다(코드량 * 변이 수만큼). CI에서는 변경된 코드만 대상으로 실행하세요.