[Java] JUnit 5 프레임워크로 테스트 코드를 작성하는 방법.

2025. 3. 17. 10:00Language/java

728x90
728x90

JUnit

  • Java 로 작성된 테스트 프레임워크.
  • 단위 테스트(unit testing)**와 자동화된 테스트를 수행하는 데 사용.
  • 테스트 코드 작성, 실행, 결과 확인을 편리하게 할 수 있도록 돕는 도구.

JUnit의 주요 개념

1.단위 테스트(Unit Test)

  • JUnit의 기본적인 용도는 단위 테스트로 메소드, 클래스가 예상대로 동작하는지 검증하는 것.

2.테스트 클래스

  • 테스트를 작성하려면 테스트 클래스를 생성해야 함. 
  • 이 클래스는 @Test 어노테이션을 통해 테스트 메소드들을 포함.
  • 테스트 클래스는 JUnit 프레임워크에 의해 실행되며, 메소드들을 테스트 케이스로 간주하여 실행.

3.어노테이션(Annotation)

JUnit 4  JUnit 5  설명
@BeforeClass  @BeforeAll  전체 테스트 전에 실행 (static 필요)
@AfterClass  @AfterAll  전체 테스트 후에 실행 (static 필요)
@Before  @BeforeEach  각 테스트 실행 전 실행
@After   @AfterEach  각 테스트 실행 후 실행
@Ignore  @Disabled  테스트 비활성화
  @DisplayName  테스트 이름을 사용자 정의 가능
  @Nested  중첩 테스트 지원
  @TestFactory  동적 테스트 생성 가능
  @Tag  테스트 그룹 태깅 가능
  @ExtendWith  확장 기능 추가 
  @ParameterizedTest  여러 개의 입력 값을 사용 가능

 

4.검증 메소드(Assertions)

  • assertEquals(expected, actual)
    • 값이 같은지 확인
  • assertTrue(condition)
    • 조건이 참인지 확인
  • assertThrows(Exception.class, () -> {...})
    • 예외 발생 여부 확인
  • assertAll(…)
    • 여러 개의 검증을 한 번에 실행
  • assertTimeout(Duration.ofSeconds(2), () -> {...})
    • 실행 시간이 일정 시간 이하인지 확인

5.JUnit 5의 3가지 모듈

  • JUnit Platform (Engine)
    • 테스트 실행을 위한 기반을 제공하며, IDE 및 빌드 도구와 연결.
    • Maven, Gradle 등의 빌드 도구에서 테스트를 실행할 때 JUnit Platform이 동작.
  • JUnit Jupiter
    • JUnit 5의 테스트 API를 제공하는 핵심 모듈.
    • @Test, @BeforeEach, @AfterEach, @Nested, @ParameterizedTest 등의 Annotation을 지원.
    • assertEquals, assertTrue, assertAll 등의 Assertions을 지원.
  • JUnit Vintage
    • 기존 JUnit 3 또는 JUnit 4로 작성된 테스트 코드를 실행할 수 있도록 지원.
    • JUnit 5로 마이그레이션하지 않아도 기존 JUnit 4 테스트를 유지 가능.

필자의 JDK 와 Maven 버전.

> java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

> mvn -v
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: C:\Program Files\Java\apache-maven-3.9.6
Java version: 1.8.0_271, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_271\jre
Default locale: ko_KR, platform encoding: MS949
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

JUnit 프레임워크를 사용하기 위해 Maven을 사용해야 하는 이유.

  • pom.xml 파일에 의존성(Dependency)을 추가하여 자동으로 JUnit 라이브러리를 다운로드하고 프로젝트에 추가할 수 있음.
  • $ mvn test 실행 시 자동으로 JUnit을 실행할 수 있어 CI/CD 환경에서도 활용 가능.

Maven 프로젝트 생성.

Maven 프로젝트 생성 후 트리 구조.

> tree /a /f
D:.
|   pom.xml
|   
\---src
    +---main
    |   \---java
    |       \---com
    |           \---example
    |                   Calculator.java    
    |
    \---test
        \---java
            \---com
                \---example
                        CalculatorTest.java

JUnit 5 사용하기 위해 작성한 pom.xml 파일.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>app</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

<dependencies>
    <!-- JUnit 5 Jupiter API (Assertions, Annotation 포함) -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit 5 Jupiter 엔진 (테스트 실행을 위해 필수) -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>

</dependencies>


  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <!-- JUnit 5 실행을 위한 Maven Surefire Plugin 설정 -->
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.0.0-M5</version>
        </plugin>
        <plugin>
            <!-- 프로젝트를 클린 빌드(이전 빌드 결과 삭제)하기 위한 플러그인 -->
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.1.0</version>
        </plugin>

        <plugin>
            <!-- 리소스 파일 (ex. properties, XML 등)을 처리하는 플러그인 -->
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>

        <plugin>
            <!-- Java 소스 코드를 컴파일하기 위한 플러그인 -->
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
        </plugin>

        <plugin>
            <!-- 프로젝트를 .jar 파일로 패키징하는 플러그인 -->
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>

        <plugin>
            <!-- 로컬 저장소에 패키지를 설치하는 플러그인 (mvn install) -->
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
        </plugin>

        <plugin>
            <!-- 프로젝트를 원격 저장소에 배포하는 플러그인 (mvn deploy) -->
            <artifactId>maven-deploy-plugin</artifactId>
            <version>2.8.2</version>
        </plugin>

        <plugin>
            <!-- 프로젝트 문서를 생성하는 플러그인 -->
            <artifactId>maven-site-plugin</artifactId>
            <version>3.7.1</version>
        </plugin>

        <plugin>
            <!-- 프로젝트 정보 리포트를 생성하는 플러그인 -->
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Calculator.java 

package com.example;

public class Calculator {

    // 덧셈
    public int add(int a, int b) {
        return a + b;
    }

    // 뺄셈
    public int subtract(int a, int b) {
        return a - b;
    }

    // 곱셈
    public int multiply(int a, int b) {
        return a * b;
    }

    // 나눗셈 (0으로 나누기 예외 처리)
    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
        }
        return a / b;
    }
}

CalculatorTest.java

package com.example;

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import java.time.Duration;

@DisplayName("@DisplayName: Calculator 테스트")
class CalculatorTest {
    private Calculator calculator;

    @BeforeAll
    static void setupAll() {
        System.out.println("@BeforeAll: 전체 테스트 실행 전에 한 번 실행됩니다.");
    }

    @BeforeEach
    void setup() {
        calculator = new Calculator();
        System.out.println("@BeforeEach: 각 테스트 실행 전에 실행됩니다.");
    }

    @Test
    @DisplayName("@DisplayName: 덧셈 테스트")
    void testAdd() {
        System.out.println("\n@Test: testAdd() 실행");
        int result = calculator.add(2, 3);
        System.out.println("calculator.add(2, 3) 실행 -> 결과: " + result);
        
        System.out.println("assertEquals 실행 -> 예상값: 5, 실제값: " + result);
        assertEquals(5, result, "2 + 3은 5여야 합니다.");

        System.out.println("assertTrue 실행 -> 조건: " + result + " > 4");
        assertTrue(result > 4, "결과는 4보다 커야 합니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 뺄셈 테스트")
    void testSubtract() {
        System.out.println("\n@Test: testSubtract() 실행");
        int result = calculator.subtract(5, 3);
        System.out.println("calculator.subtract(5, 3) 실행 -> 결과: " + result);
        
        System.out.println("assertEquals 실행 -> 예상값: 2, 실제값: " + result);
        assertEquals(2, result, "5 - 3은 2여야 합니다.");

        System.out.println("assertFalse 실행 -> 조건: " + result + " > 2");
        assertFalse(result > 2, "결과는 2보다 크면 안됩니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 곱셈 테스트")
    void testMultiply() {
        System.out.println("\n@Test: testMultiply() 실행");
        int result = calculator.multiply(3, 5);
        System.out.println("calculator.multiply(3, 5) 실행 -> 결과: " + result);
        
        System.out.println("assertEquals 실행 -> 예상값: 15, 실제값: " + result);
        assertEquals(15, result, "3 * 5는 15여야 합니다.");

        System.out.println("assertTrue 실행 -> 조건: " + result + " > 10");
        assertTrue(result > 10, "결과는 10보다 커야 합니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 나눗셈 테스트")
    void testDivide() {
        System.out.println("\n@Test: testDivide() 실행");
        int result = calculator.divide(6, 3);
        System.out.println("calculator.divide(6, 3) 실행 -> 결과: " + result);
        
        System.out.println("assertEquals 실행 -> 예상값: 2, 실제값: " + result);
        assertEquals(2, result, "6 / 3은 2여야 합니다.");

        System.out.println("assertTrue 실행 -> 조건: " + result + " == 2");
        assertTrue(result == 2, "결과는 정확히 2여야 합니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 예외 테스트 - 0으로 나누기")
    void testDivideByZero() {
        System.out.println("\n@Test: testDivideByZero() 실행");
        
        System.out.println("assertThrows 실행 -> 예상 예외: IllegalArgumentException");
        assertThrows(IllegalArgumentException.class, () -> calculator.divide(5, 0), "0으로 나누면 예외가 발생해야 합니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 실행 시간 테스트")
    void testExecutionTime() {
        System.out.println("\n@Test: testExecutionTime() 실행");

        System.out.println("assertTimeout 실행 -> 최대 실행 시간: 1초");
        assertTimeout(Duration.ofSeconds(1), () -> {
            Thread.sleep(500);
            calculator.add(1, 1);
        }, "이 테스트는 1초 이내에 완료되어야 합니다.");

        System.out.println();
    }

    @Test
    @DisplayName("@DisplayName: 여러 개의 Assertions 테스트")
    void testMultipleAssertions() {
        System.out.println("\n@Test: testMultipleAssertions() 실행");
        
        System.out.println("assertAll 실행 - 여러 개의 Assertions을 그룹화하여 실행");
        assertAll("Grouped Assertions",
            () -> {
                int result = calculator.add(2, 3);
                System.out.println("calculator.add(2, 3) 실행 -> 결과: " + result);
                System.out.println("assertEquals 실행 -> 예상값: 5, 실제값: " + result);
                assertEquals(5, result, "2 + 3은 5여야 합니다.");
            },
            () -> {
                int result = calculator.subtract(5, 3);
                System.out.println("calculator.subtract(5, 3) 실행 -> 결과: " + result);
                System.out.println("assertEquals 실행 -> 예상값: 2, 실제값: " + result);
                assertEquals(2, result, "5 - 3은 2여야 합니다.");
            },
            () -> {
                int result = calculator.multiply(3, 5);
                System.out.println("calculator.multiply(3, 5) 실행 -> 결과: " + result);
                System.out.println("assertEquals 실행 -> 예상값: 15, 실제값: " + result);
                assertEquals(15, result, "3 * 5는 15여야 합니다.");
            },
            () -> {
                int result = calculator.divide(6, 3);
                System.out.println("calculator.divide(6, 3) 실행 -> 결과: " + result);
                System.out.println("assertEquals 실행 -> 예상값: 2, 실제값: " + result);
                assertEquals(2, result, "6 / 3은 2여야 합니다.");
            }
        );

        System.out.println();
    }

    @AfterEach
    void setDown() {
        System.out.println("@AfterEach: 각 테스트 실행 후 실행됩니다.");
    }

    @AfterAll
    static void setDownAll() {
        System.out.println("@AfterAll: 전체 테스트 실행 후 한 번 실행됩니다.");
    }
}

빌드 및 테스트 결과.

> mvn test
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------------< com.example:app >---------------------------
[INFO] Building app 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.0.2:resources (default-resources) @ app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\codes\java\app\src\main\resources
[INFO] 
[INFO] --- compiler:3.8.0:compile (default-compile) @ app ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.0.2:testResources (default-testResources) @ app ---     
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\codes\java\app\src\test\resources
[INFO] 
[INFO] --- compiler:3.8.0:testCompile (default-testCompile) @ app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\codes\java\app\target\test-classes
[INFO] 
[INFO] --- surefire:3.0.0-M5:test (default-test) @ app ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.CalculatorTest
@BeforeAll: 전체 테스트 실행 전에 한 번 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testDivideByZero() 실행
assertThrows 실행 -> 예상 예외: IllegalArgumentException

@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testExecutionTime() 실행
assertTimeout 실행 -> 최대 실행 시간: 1@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testAdd() 실행
calculator.add(2, 3) 실행 -> 결과: 5
assertEquals 실행 -> 예상값: 5, 실제값: 5
assertTrue 실행 -> 조건: 5 > 4

@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testSubtract() 실행
calculator.subtract(5, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
assertFalse 실행 -> 조건: 2 > 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testMultipleAssertions() 실행
assertAll 실행 - 여러 개의 Assertions을 그룹화하여 실행
calculator.add(2, 3) 실행 -> 결과: 5
assertEquals 실행 -> 예상값: 5, 실제값: 5
calculator.subtract(5, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
calculator.multiply(3, 5) 실행 -> 결과: 15
assertEquals 실행 -> 예상값: 15, 실제값: 15
calculator.divide(6, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testDivide() 실행
calculator.divide(6, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
assertTrue 실행 -> 조건: 2 == 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testMultiply() 실행
calculator.multiply(3, 5) 실행 -> 결과: 15
assertEquals 실행 -> 예상값: 15, 실제값: 15
assertTrue 실행 -> 조건: 15 > 10

@AfterEach: 각 테스트 실행 후 실행됩니다.
@AfterAll: 전체 테스트 실행 후 한 번 실행됩니다.
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.586 s - in com.example.CalculatorTest
[INFO] 
[INFO] Results:
[INFO]
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.266 s
[INFO] Finished at: 2025-03-14T22:48:23+09:00
[INFO] ------------------------------------------------------------------------

mvn test 후 트리 구조.

> tree /a /f
D:.
|   pom.xml
|
+---src
|   +---main
|   |   \---java
|   |       \---com
|   |           \---example
|   |                   Calculator.java
|   |
|   \---test
|       \---java
|           \---com
|               \---example
|                       CalculatorTest.java
|
\---target
    +---classes
    |   \---com
    |       \---example
    |               Calculator.class
    |
    +---generated-sources
    |   \---annotations
    +---generated-test-sources
    |   \---test-annotations
    +---maven-status
    |   \---maven-compiler-plugin
    |       +---compile
    |       |   \---default-compile
    |       |           createdFiles.lst
    |       |           inputFiles.lst
    |       |
    |       \---testCompile
    |           \---default-testCompile
    |                   createdFiles.lst
    |                   inputFiles.lst
    |
    +---surefire-reports
    |       2025-03-14T22-48-22_223.dumpstream
    |       com.example.CalculatorTest.txt
    |       TEST-com.example.CalculatorTest.xml
    |
    \---test-classes
        \---com
            \---example
                    CalculatorTest.class

lst 파일 확인.

  • Maven Compiler Plugin (maven-compiler-plugin)이 소스 파일과 컴파일된 파일을 추적하기 위해 생성하는 파일.
  • 컴파일 성능을 위해 재 컴파일 시, 변경된 파일만 컴파일하기 위해 필요.
>type .\target\maven-status\maven-compiler-plugin\compile\default-compile\createdFiles.lst
com\example\Calculator.class
>type .\target\maven-status\maven-compiler-plugin\compile\default-compile\inputFiles.lst
D:\codes\java\app\src\main\java\com\example\Calculator.java

>type .\target\maven-status\maven-compiler-plugin\compile\default-testCompile\createdFiles.lst
com\example\CalculatorTest.class
>type .\target\maven-status\maven-compiler-plugin\compile\default-testCompile\inputFiles.lst
D:\codes\java\app\src\test\java\com\example\CalculatorTest.java

테스트 실행 후 생성된 테스트 결과 파일 확인.

  • 텍스트 기반 테스트 결과.
>type .\target\surefire-reports\com.example.CalculatorTest.txt
-------------------------------------------------------------------------------
Test set: com.example.CalculatorTest
-------------------------------------------------------------------------------
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.586 s - in com.example.CalculatorTest
  • XML 기반 테스트 결과.
>type .\target\surefire-reports\TEST-com.example.CalculatorTest.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report-3.0.xsd" version="3.0" name="com.example.CalculatorTest" time="0.586" tests="7" errors="0" skipped="0" failures="0">
  <properties>
    <property name="sun.desktop" value="windows"/>
    <property name="awt.toolkit" value="sun.awt.windows.WToolkit"/>
    <property name="file.encoding.pkg" value="sun.io"/>
    <property name="java.specification.version" value="1.8"/>
    <property name="sun.cpu.isalist" value="amd64"/>
    <property name="sun.jnu.encoding" value="MS949"/>
    <property name="java.class.path" value="D:\codes\java\app\target\test-classes;D:\codes\java\app\target\classes;C:\Users\tmax\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\tmax\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\tmax\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\tmax\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\tmax\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\tmax\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;"/>
    <property name="java.vm.vendor" value="Oracle Corporation"/>
    <property name="sun.arch.data.model" value="64"/>
    <property name="user.variant" value=""/>
    <property name="java.vendor.url" value="http://java.oracle.com/"/>
    <property name="user.timezone" value="Asia/Seoul"/>
    <property name="java.vm.specification.version" value="1.8"/>
    <property name="os.name" value="Windows 10"/>
    <property name="user.country" value="KR"/>
    <property name="sun.java.launcher" value="SUN_STANDARD"/>
    <property name="sun.boot.library.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\bin"/>
    <property name="sun.java.command" value="C:\Windows\Temp\surefire3777680061676723757\surefirebooter5339340197557362624.jar C:\Windows\Temp\surefire3777680061676723757 2025-03-14T22-48-22_223-jvmRun1 surefire88413729702819039tmp surefire_04262568155736267106tmp"/>
    <property name="surefire.test.class.path" value="D:\codes\java\app\target\test-classes;D:\codes\java\app\target\classes;C:\Users\tmax\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\tmax\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\tmax\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\tmax\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\tmax\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\tmax\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;"/>
    <property name="sun.cpu.endian" value="little"/>
    <property name="user.home" value="C:\Users\tmax"/>
    <property name="user.language" value="ko"/>
    <property name="java.specification.vendor" value="Oracle Corporation"/>
    <property name="java.home" value="C:\Program Files\Java\jdk1.8.0_271\jre"/>
    <property name="basedir" value="D:\codes\java\app"/>
    <property name="file.separator" value="\"/>
    <property name="line.separator" value="&#10;"/>
    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
    <property name="java.specification.name" value="Java Platform API Specification"/>
    <property name="java.awt.graphicsenv" value="sun.awt.Win32GraphicsEnvironment"/>
    <property name="surefire.real.class.path" value="C:\Windows\Temp\surefire3777680061676723757\surefirebooter5339340197557362624.jar"/>
    <property name="sun.boot.class.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_271\jre\classes"/>
    <property name="user.script" value=""/>
    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
    <property name="java.runtime.version" value="1.8.0_271-b09"/>
    <property name="user.name" value="tmax"/>
    <property name="path.separator" value=";"/>
    <property name="os.version" value="10.0"/>
    <property name="java.endorsed.dirs" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\endorsed"/>
    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
    <property name="file.encoding" value="MS949"/>
    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
    <property name="localRepository" value="C:\Users\tmax\.m2\repository"/>
    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
    <property name="java.io.tmpdir" value="C:\WINDOWS\TEMP\"/>
    <property name="java.version" value="1.8.0_271"/>
    <property name="user.dir" value="D:\codes\java\app"/>
    <property name="os.arch" value="amd64"/>
    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
    <property name="java.awt.printerjob" value="sun.awt.windows.WPrinterJob"/>
    <property name="sun.os.patch.level" value=""/>
    <property name="java.library.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python\Scripts\;C:\Program Files\Python\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\NetSarang\Xshell 7\;C:\MinGW\bin;C:\Program Files\Java\jdk1.8.0_271\\bin;C:\Program Files\Java\apache-maven-3.9.6\bin;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\TortoiseGit\bin;C:\Program Files\Java\jdk1.8.0_271\bin;;C:\Microsoft VS Code\bin;."/>
    <property name="java.vm.info" value="mixed mode"/>
    <property name="java.vendor" value="Oracle Corporation"/>
    <property name="java.vm.version" value="25.271-b09"/>
    <property name="java.ext.dirs" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext"/>
    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
    <property name="java.class.version" value="52.0"/>
  </properties>
  <testcase name="testDivideByZero" classname="com.example.CalculatorTest" time="0.027">
    <system-out><![CDATA[@BeforeAll: 전체 테스트 실행 전에 한 번 실행됩니다.
@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testDivideByZero() 실행
assertThrows 실행 -> 예상 예외: IllegalArgumentException

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testExecutionTime" classname="com.example.CalculatorTest" time="0.516">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testExecutionTime() 실행
assertTimeout 실행 -> 최대 실행 시간: 1초

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testAdd" classname="com.example.CalculatorTest" time="0">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testAdd() 실행
calculator.add(2, 3) 실행 -> 결과: 5
assertEquals 실행 -> 예상값: 5, 실제값: 5
assertTrue 실행 -> 조건: 5 > 4

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testSubtract" classname="com.example.CalculatorTest" time="0.008">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testSubtract() 실행
calculator.subtract(5, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
assertFalse 실행 -> 조건: 2 > 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testMultipleAssertions" classname="com.example.CalculatorTest" time="0.005">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testMultipleAssertions() 실행
assertAll 실행 - 여러 개의 Assertions을 그룹화하여 실행
calculator.add(2, 3) 실행 -> 결과: 5
assertEquals 실행 -> 예상값: 5, 실제값: 5
calculator.subtract(5, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
calculator.multiply(3, 5) 실행 -> 결과: 15
assertEquals 실행 -> 예상값: 15, 실제값: 15
calculator.divide(6, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testDivide" classname="com.example.CalculatorTest" time="0.002">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testDivide() 실행
calculator.divide(6, 3) 실행 -> 결과: 2
assertEquals 실행 -> 예상값: 2, 실제값: 2
assertTrue 실행 -> 조건: 2 == 2

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
  <testcase name="testMultiply" classname="com.example.CalculatorTest" time="0.001">
    <system-out><![CDATA[@BeforeEach: 각 테스트 실행 전에 실행됩니다.

@Test: testMultiply() 실행
calculator.multiply(3, 5) 실행 -> 결과: 15
assertEquals 실행 -> 예상값: 15, 실제값: 15
assertTrue 실행 -> 조건: 15 > 10

@AfterEach: 각 테스트 실행 후 실행됩니다.
]]></system-out>
  </testcase>
</testsuite>
728x90
728x90