Java 소스 코드의 if문을 분석하여 모든 분기 조합을 테스트하는 JUnit 테스트 코드를 자동으로 생성하는 도구입니다.
- Java 소스 코드 파싱 및 if문 추출
- 조건문에 사용된 변수 및 값 식별
- 모든 가능한 변수 값 조합 생성 (카르테시안 곱)
- 경계값 분석을 통한 추가 테스트 케이스 생성
- JUnit 5 테스트 코드 자동 생성
- Java 11 이상
- Maven 3.x
# 의존성 설치 및 빌드
mvn clean install
# 컴파일만 수행
mvn compilemvn 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"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" // 출력 파일
);
}
}if (age > 18) { }
if (count == 0) { }
if (price >= 100) { }if (age > 18 && isValid) { }
if (count < 10 || status.equals("premium")) { }if (isActive) { }
if (!isDeleted) { }if ((age > 18 && country.equals("USA")) || isPremium) { }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 # 생성된 테스트 (예제)
- JavaParser 라이브러리를 사용하여 Java 소스 코드 파싱
- if문 추출 및 조건식 분석
- 변수, 연산자, 값 식별
- 모든 변수 값 조합 생성 (카르테시안 곱)
- 경계값 추가 (boundary value analysis)
- JUnit 5 테스트 코드 생성
- if문의 조건 정보 저장
- 변수별 조건 및 타입 정보 관리
- 각 테스트 케이스의 변수 값 조합 저장
- 테스트 설명 생성
- 현재는 메서드 파라미터 기반의 조건만 지원
- 객체의 메서드 호출 결과를 조건으로 사용하는 경우 완전한 분석 불가
- 복잡한 중첩 조건의 경우 일부 케이스가 누락될 수 있음
- 생성된 테스트 코드는 템플릿이므로 실제 검증 로직은 수동으로 추가 필요
- 타입 추론 개선 (심볼 리졸버 통합)
- 메서드 호출 기반 조건 분석
- 예상 결과 자동 생성
- 중복 테스트 케이스 제거
- Switch문 지원
- 삼항 연산자 지원
- Mockito 통합
MIT License