Pink Spider/Mutation Testing in Java, Pitest

Created Thu, 03 Jul 2025 10:44:24 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
972 Words 4 min

아래에 Java에서 PIT (Pitest) Mutation Testing을 사용하는 방법을 단계별로 정리해 드립니다. PIT는 자바 코드의 테스트 커버리지를 실제로 검증하는 강력한 도구로, 잘못된(변이된) 코드를 테스트가 얼마나 잘 잡아내는지를 측정합니다.


📌 1. PIT(Pitest) 소개

  • Mutation Testing이란?

    • 기존 코드를 일부러 “변이(mutant)” 시켜서 테스트를 돌려보는 기법입니다.
    • 테스트가 이 변이를 검출하지 못하면, 테스트에 허점이 있다는 뜻입니다.
    • 단순한 라인 커버리지보다 더 신뢰성 있는 테스트 품질 지표를 제공합니다.
  • PIT의 특징

    • JUnit 기반 테스트와 잘 통합됩니다.
    • Maven, Gradle, Ant에서 쉽게 사용 가능합니다.
    • HTML 및 XML 리포트를 생성합니다.

⚙️ 2. Maven 프로젝트에 PIT 적용

2.1 Maven 플러그인 추가

pom.xml에 다음 플러그인을 설정합니다:

<build>
  <plugins>
    <plugin>
      <groupId>org.pitest</groupId>
      <artifactId>pitest-maven</artifactId>
      <version>1.15.2</version> <!-- 최신 버전 확인 권장 -->
      <configuration>
        <!-- 변이 테스트에 포함할 클래스 패턴 -->
        <targetClasses>
          <param>com.yourcompany.*</param>
        </targetClasses>
        <!-- 변이 테스트에 포함할 테스트 클래스 패턴 -->
        <targetTests>
          <param>com.yourcompany.*Test</param>
        </targetTests>
        <!-- 빠르게 하려면 스레드 수 조절 -->
        <threads>4</threads>
        <!-- HTML 리포트 생성 디렉토리 -->
        <outputFormats>
          <param>HTML</param>
        </outputFormats>
      </configuration>
    </plugin>
  </plugins>
</build>

targetClasses에는 실제 비즈니스 로직 클래스, targetTests에는 테스트 클래스의 패키지/패턴을 지정하세요.


2.2 실행

터미널에서 아래 명령어를 실행:

mvn org.pitest:pitest-maven:mutationCoverage

실행이 끝나면 target/pit-reports/YYYYMMDDHHMI 폴더에 HTML 리포트가 생성됩니다.


🛠️ 3. Gradle 프로젝트에 PIT 적용

Gradle을 쓰시는 경우 build.gradle에 다음을 추가합니다:

3.1 플러그인 추가

Gradle 7 이상 기준:

plugins {
    id 'info.solidsoft.pitest' version '1.15.0'
}

3.2 설정 예시

pitest {
    targetClasses = ['com.yourcompany.*']
    targetTests = ['com.yourcompany.*Test']
    threads = 4
    outputFormats = ['HTML']
}

3.3 실행

./gradlew pitest

리포트는 build/reports/pitest 폴더에 생성됩니다.


🔍 4. 주요 Mutation Operator 예시

PIT가 사용하는 변이 예시는 다음과 같습니다:

변이 종류 예시
조건 반전 == ➡️ !=
수학 연산 변경 + ➡️ -
리턴 값 변경 return true; ➡️ return false;
void method 삭제 메서드 내용 제거

이러한 변이들을 테스트가 잡아내지 못하면 Survived로 표시되며, 잡아내면 Killed로 표시됩니다.


📈 5. 리포트 해석

리포트에는 다음 정보가 포함됩니다:

  • Mutation Coverage 퍼센트
  • 어떤 변이가 Survived(살아남음)인지
  • 어떤 테스트가 어떤 변이를 탐지했는지

일반적으로 80% 이상의 mutation coverage를 목표로 하면 좋습니다.


🚩 6. 팁 및 참고 사항

테스트 속도 최적화

  • threads 설정으로 멀티스레드 사용.
  • 패키지 범위를 좁혀서 점진적으로 분석.

테스트 명확화

  • Survived인 변이는 보완 테스트 케이스 작성 필요.

IDE 통합

  • 일부 IDE 플러그인(e.g., IntelliJ용 PIT 플러그인)을 통해 바로 실행 가능.

CI 연동

  • Jenkins, GitLab CI에서 PIT를 자동으로 실행하도록 설정 가능.