[Java] JUnit 5 프레임워크로 테스트 코드를 작성하는 방법.
2025. 3. 17. 10:00ㆍLanguage/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=" "/>
<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
'Language > java' 카테고리의 다른 글
[Java] Maven 프로젝트 생성 및 실행하는 방법. (0) | 2025.03.07 |
---|---|
[Java] 파일의 값을 HTTP Header로 설정하는 방법. (0) | 2024.11.08 |
[Java] JSON의 Key를 파싱하고 Value를 파일로 저장하는 방법. (0) | 2024.11.02 |
[Java] jar 파일에 포함된 외부 라이브러리를 제거하는 방법. (0) | 2024.09.27 |
[java] 대칭 키(AES) 알고리즘을 사용해서 데이터를 Base64 방식으로 인코딩/디코딩하는 방법. (0) | 2022.11.16 |