Skip to content

Jack-Cha/TestGenerator

Repository files navigation

Java 분기 커버리지 테스트 자동 생성 도구

Java 소스 코드의 if문을 분석하여 모든 분기 조합을 테스트하는 JUnit 테스트 코드를 자동으로 생성하는 도구입니다.

기능

  • Java 소스 코드 파싱 및 if문 추출
  • 조건문에 사용된 변수 및 값 식별
  • 모든 가능한 변수 값 조합 생성 (카르테시안 곱)
  • 경계값 분석을 통한 추가 테스트 케이스 생성
  • JUnit 5 테스트 코드 자동 생성

요구사항

  • Java 11 이상
  • Maven 3.x

설치 및 빌드

# 의존성 설치 및 빌드
mvn clean install

# 컴파일만 수행
mvn compile

사용 방법

1. 커맨드라인에서 실행

mvn exec:java -Dexec.mainClass="com.testgen.Main" \
  -Dexec.args="<source-file> <package> <class-name> <output-file>"

예제:

mvn exec:java -Dexec.mainClass="com.testgen.Main" \
  -Dexec.args="src/main/java/com/example/Calculator.java com.example Calculator src/test/java/com/example/CalculatorTest.java"

2. Java 코드에서 사용

import com.testgen.Main;

public class TestGenerator {
    public static void main(String[] args) throws IOException {
        Main.generateTestForFile(
            "src/main/java/com/example/Calculator.java",  // 분석할 소스 파일
            "com.example",                                 // 패키지명
            "Calculator",                                  // 클래스명
            "src/test/java/com/example/CalculatorTest.java" // 출력 파일
        );
    }
}

지원하는 조건문 패턴

1. 비교 연산자

if (age > 18) { }
if (count == 0) { }
if (price >= 100) { }

2. 논리 연산자

if (age > 18 && isValid) { }
if (count < 10 || status.equals("premium")) { }

3. Boolean 변수

if (isActive) { }
if (!isDeleted) { }

4. 복합 조건

if ((age > 18 && country.equals("USA")) || isPremium) { }

예제

입력 Java 코드 (Calculator.java)

package com.example;

public class Calculator {
    public String evaluateNumber(int number, boolean isPositive) {
        if (number > 0 && isPositive) {
            return "Positive and valid";
        }

        if (number < 0) {
            return "Negative";
        }

        if (number == 0) {
            return "Zero";
        }

        return "Unknown";
    }
}

생성된 테스트 코드

package com.example;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {
    private Calculator target = new Calculator();

    @Test
    @DisplayName("number=0, isPositive=true")
    public void testEvaluateNumber_Case1() {
        // Given
        // number = 0
        // isPositive = true

        // When
        // TODO: evaluateNumber 메서드 호출 및 결과 확인
        // 예: String result = target.evaluateNumber(0, true);

        // Then
        // TODO: 예상 결과 확인
        // 예: assertEquals("Zero", result);
    }

    @Test
    @DisplayName("number=1, isPositive=true")
    public void testEvaluateNumber_Case2() {
        // Given
        // number = 1
        // isPositive = true

        // When
        // TODO: evaluateNumber 메서드 호출 및 결과 확인
        // 예: String result = target.evaluateNumber(1, true);

        // Then
        // TODO: 예상 결과 확인
        // 예: assertEquals("Positive and valid", result);
    }

    // ... 추가 테스트 케이스들
}

분석 결과 예제

프로그램을 실행하면 다음과 같은 분석 결과가 출력됩니다:

=== Java 소스 분석 시작 ===

=== 분석 결과 ===

Method: evaluateNumber
  Line 8: number > 0 && isPositive
    - Variable: number > 0 (type: int)
    - Variable: isPositive == true (type: boolean)
  Line 12: number < 0
    - Variable: number < 0 (type: int)
  Line 16: number == 0
    - Variable: number == 0 (type: int)

=== JUnit 테스트 코드 생성 시작 ===

메서드: evaluateNumber
생성된 테스트 케이스:
  - number=-1, isPositive=true
  - number=-1, isPositive=false
  - number=0, isPositive=true
  - number=0, isPositive=false
  - number=1, isPositive=true
  - number=1, isPositive=false

테스트 코드가 생성되었습니다: src/test/java/com/example/CalculatorTest.java
총 6개의 테스트 케이스가 생성되었습니다.

프로젝트 구조

src/
├── main/
│   └── java/
│       ├── com/
│       │   ├── testgen/
│       │   │   ├── Main.java                      # 메인 실행 클래스
│       │   │   ├── analyzer/
│       │   │   │   └── JavaSourceAnalyzer.java    # Java 소스 분석기
│       │   │   ├── generator/
│       │   │   │   └── JUnitTestGenerator.java    # 테스트 코드 생성기
│       │   │   └── model/
│       │   │       ├── ConditionInfo.java         # 조건 정보 모델
│       │   │       └── TestCase.java              # 테스트 케이스 모델
│       │   └── example/
│       │       └── Calculator.java                # 예제 클래스
└── test/
    └── java/
        └── com/
            └── example/
                └── CalculatorTest.java            # 생성된 테스트 (예제)

주요 클래스 설명

JavaSourceAnalyzer

  • JavaParser 라이브러리를 사용하여 Java 소스 코드 파싱
  • if문 추출 및 조건식 분석
  • 변수, 연산자, 값 식별

JUnitTestGenerator

  • 모든 변수 값 조합 생성 (카르테시안 곱)
  • 경계값 추가 (boundary value analysis)
  • JUnit 5 테스트 코드 생성

ConditionInfo

  • if문의 조건 정보 저장
  • 변수별 조건 및 타입 정보 관리

TestCase

  • 각 테스트 케이스의 변수 값 조합 저장
  • 테스트 설명 생성

제한사항

  • 현재는 메서드 파라미터 기반의 조건만 지원
  • 객체의 메서드 호출 결과를 조건으로 사용하는 경우 완전한 분석 불가
  • 복잡한 중첩 조건의 경우 일부 케이스가 누락될 수 있음
  • 생성된 테스트 코드는 템플릿이므로 실제 검증 로직은 수동으로 추가 필요

향후 개선 사항

  • 타입 추론 개선 (심볼 리졸버 통합)
  • 메서드 호출 기반 조건 분석
  • 예상 결과 자동 생성
  • 중복 테스트 케이스 제거
  • Switch문 지원
  • 삼항 연산자 지원
  • Mockito 통합

라이선스

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors