Junit5 공식문서 정리 및 실습_1(정의)
TDD를 학습하던중 JUnit 에 대한 학습이 더 필요해서 실습 자료를 찾아서 내용 학습과 과정을 기록하려 한다
JUnit5 공식문서
1. JUnit 5란 무엇인가요?
이전 버전의 JUnit과는 달리 JUnit 5는 세 개의 하위 프로젝트의 여러 모듈로 구성되어 있습니다.
JUnit 5 = JUnit 플랫폼 + JUnit Jupiter + JUnit 빈티지
JUnit 플랫폼은 JVM에서 테스트 프레임워크를 시작하기 위한 기반 역할을 합니다 . 또한 TestEngine플랫폼에서 실행되는 테스트 프레임워크를 개발하기 위한 API를 정의합니다. 나아가 이 플랫폼은 명령줄에서 플랫폼을 시작하기 위한 Console Launcher 와 플랫폼에서 하나 이상의 테스트 엔진을 사용하여 사용자 정의 테스트 모음을 실행하기 위한 JUnit Platform Suite Engine을 제공합니다 . JUnit 플랫폼에 대한 일류 지원은 인기 있는 IDE( IntelliJ IDEA , Eclipse , NetBeans 및 Visual Studio Code 참조 )와 빌드 도구( Gradle , Maven 및 Ant 참조 )에도 제공됩니다.
JUnit Jupiter 는 JUnit 5에서 테스트와 확장 기능을 작성하기 위한 프로그래밍 모델 과 확장 모델을 결합한 것입니다. Jupiter 하위 프로젝트는 TestEngine플랫폼에서 Jupiter 기반 테스트를 실행하기 위한 기능을 제공합니다.
JUnit Vintage는 플랫폼에서 JUnit 3 및 JUnit 4 기반 테스트를 실행하기 위한 를 제공합니다 TestEngine. 클래스 경로 또는 모듈 경로에 JUnit 4.12 이상이 있어야 합니다.
2. 지원되는 Java 버전
JUnit 5는 런타임에 Java 8(또는 그 이상)이 필요합니다. 그러나 이전 버전의 JDK로 컴파일된 코드를 여전히 테스트할 수 있습니다.
3. 도움 받기
Stack Overflow 에서 JUnit 5 관련 질문을 하거나 Gitter 에서 커뮤니티와 채팅하세요 .
4. 시작하기
4.1. JUnit 아티팩트 다운로드
프로젝트에 다운로드하고 포함할 수 있는 아티팩트를 알아보려면 종속성 메타데이터를 참조하세요 . 빌드에 대한 종속성 관리를 설정하려면 빌드 지원 및 예제 프로젝트를 참조하세요 .
4.2. JUnit 5 기능
JUnit 5에서 사용할 수 있는 기능과 그 사용 방법을 알아보려면 주제별로 구성된 이 사용자 가이드의 해당 섹션을 읽어보세요.
4.3. 예제 프로젝트
복사하여 실험할 수 있는 프로젝트의 완전하고 작동하는 예를 보려면 junit5-samples저장소가 시작하기에 좋은 곳입니다. 저장소는 JUnit Jupiter, JUnit Vintage 및 기타 테스트 프레임워크를 기반으로 하는 샘플 프로젝트 컬렉션을 호스팅합니다. 예제 프로젝트에서 적절한 빌드 스크립트(예: , 등) junit5-samples를 찾을 수 있습니다 . 아래 링크는 선택할 수 있는 몇 가지 조합을 강조합니다.build.gradlepom.xml
- Gradle과 Java의 경우 junit5-jupiter-starter-gradle프로젝트를 확인하세요.
- Gradle과 Kotlin의 경우 junit5-jupiter-starter-gradle-kotlin프로젝트를 확인하세요.
- Gradle과 Groovy에 대한 junit5-jupiter-starter-gradle-groovy프로젝트를 확인해보세요.
- Maven의 경우 junit5-jupiter-starter-maven프로젝트를 확인하세요.
- Ant의 경우 junit5-jupiter-starter-ant프로젝트를 확인해 보세요.
5. 예제 프로젝트
다음 예는 JUnit Jupiter에서 테스트를 작성하는 데 필요한 최소 요구 사항을 간략하게 보여줍니다. 이 장의 후속 섹션에서는 사용 가능한 모든 기능에 대한 자세한 내용을 제공합니다.
case1)
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
public void addition() {
// assertEquals(3,calculator.add(1,1)); // 실패
assertEquals(2,calculator.add(1,1)); // 성공
}
}
public class Calculator {
int add(int a, int b) {
return a + b;
}
}
처음 실행하면 에러가 발생한다
build.gradle 에 test 추가하여 실행해야 정상동작 한다
test {
useJUnitPlatform()
}
5.1. 주석
JUnit Jupiter는 테스트 구성과 프레임워크 확장을 위해 다음 주석을 지원합니다.
org.junit.jupiter.api달리 명시하지 않는 한 모든 핵심 주석은 모듈 의 패키지 에 있습니다 junit-jupiter-api.
주석설명
@Test | 메서드가 테스트 메서드임을 나타냅니다. JUnit 4의 @Test주석과 달리 이 주석은 JUnit Jupiter의 테스트 확장이 자체 전용 주석을 기반으로 작동하기 때문에 속성을 선언하지 않습니다. 이러한 메서드는 재정의되지 않는 한 상속됩니다. |
@ParameterizedTest | 메서드가 매개변수화된 테스트 임을 나타냅니다 . 이러한 메서드는 오버라이드되지 않는 한 상속됩니다. |
@RepeatedTest | 메서드가 반복 테스트를 위한 테스트 템플릿임을 나타냅니다 . 이러한 메서드는 오버라이드되지 않는 한 상속됩니다. |
@TestFactory | 메서드가 동적 테스트를 위한 테스트 팩토리임을 나타냅니다 . 이러한 메서드는 오버라이드되지 않는 한 상속됩니다. |
@TestTemplate | 메서드가 등록된 공급자 가 반환한 호출 컨텍스트 수에 따라 여러 번 호출되도록 설계된 테스트 사례의 템플릿 임을 나타냅니다 . 이러한 메서드는 재정의되지 않는 한 상속됩니다. |
@TestClassOrder | 주석이 달린 테스트 클래스의 테스트 클래스에 대한 테스트 클래스 실행 순서를 구성하는 데 사용됩니다 @Nested. 이러한 주석은 상속됩니다. |
@TestMethodOrder | 주석이 달린 테스트 클래스에 대한 테스트 메서드 실행 순서를 구성하는 데 사용됩니다 . JUnit 4의 와 유사합니다 @FixMethodOrder. 이러한 주석은 상속됩니다. |
@TestInstance | 주석이 달린 테스트 클래스에 대한 테스트 인스턴스 라이프사이클을 구성하는 데 사용됩니다 . 이러한 주석은 상속됩니다. |
@DisplayName | 테스트 클래스 또는 테스트 메서드에 대한 사용자 지정 표시 이름을 선언합니다. 이러한 주석은 상속되지 않습니다. |
@DisplayNameGeneration | 테스트 클래스에 대한 사용자 정의 표시 이름 생성기를 선언합니다. 이러한 주석은 상속됩니다. |
@BeforeEach | 주석이 달린 메서드가 현재 클래스의 각 , , , 또는 메서드 보다 먼저 실행되어야 함을 나타냅니다 . JUnit 4의 와 유사합니다 . 이러한 메서드는 재정의되지 않는 한 상속됩니다. @Test@RepeatedTest@ParameterizedTest@TestFactory@Before |
@AfterEach | 주석이 달린 메서드가 현재 클래스의 각 , , , 또는 메서드 다음에 실행되어야 함을 나타냅니다 . JUnit 4의 와 유사합니다 . 이러한 메서드는 재정의되지 않는 한 상속됩니다. @Test@RepeatedTest@ParameterizedTest@TestFactory@After |
@BeforeAll | 주석이 달린 메서드가 현재 클래스의 모든 , , , 및 메서드 보다 먼저 실행되어야 함을 나타냅니다 . JUnit 4의 와 유사합니다 . 이러한 메서드는 재정의되지 않는 한 상속되며 "클래스별" 테스트 인스턴스 라이프사이클이 사용되지 않는 한 상속되어야 합니다. @Test@RepeatedTest@ParameterizedTest@TestFactory@BeforeClassstatic |
@AfterAll | 주석이 달린 메서드는 현재 클래스의 모든 , , , 및 메서드 다음에 실행되어야 함을 나타냅니다 . JUnit 4의 와 유사합니다 . 이러한 메서드는 재정의되지 않는 한 상속되며 "클래스별" 테스트 인스턴스 라이프사이클이 사용되지 않는 한 상속되어야 합니다. @Test@RepeatedTest@ParameterizedTest@TestFactory@AfterClassstatic |
@Nested | 주석 이 달린 클래스가 비정적 중첩 테스트 클래스 임을 나타냅니다 . Java 8에서 Java 15까지는 "클래스별" 테스트 인스턴스 라이프사이클을@BeforeAll 사용하지 않는 한 테스트 클래스 에서 @AfterAll메서드를 직접 사용할 수 없습니다 . Java 16부터는 테스트 인스턴스 라이프사이클 모드 중 하나를 사용하여 테스트 클래스 에서 메서드를 선언할 수 있습니다 . 이러한 주석은 상속되지 않습니다.@Nested@BeforeAll@AfterAllstatic@Nested |
@Tag | 클래스 또는 메서드 수준에서 테스트를 필터링하기 위한 태그를 선언하는 데 사용됩니다 . TestNG의 테스트 그룹이나 JUnit 4의 카테고리와 유사합니다. 이러한 주석은 클래스 수준에서는 상속되지만 메서드 수준에서는 상속되지 않습니다. |
@Disabled | 테스트 클래스나 테스트 메서드를 비활성화하는 데 사용됨 . JUnit 4의 와 유사함 @Ignore. 이러한 주석은 상속되지 않음. |
@AutoClose | 주석이 달린 필드는 테스트 실행 후 자동으로 닫히는 리소스를 나타낸다는 것을 나타냅니다 . |
@Timeout | 실행이 주어진 기간을 초과하면 테스트, 테스트 팩토리, 테스트 템플릿 또는 라이프사이클 메서드가 실패하는 데 사용됩니다. 이러한 주석은 상속됩니다. |
@TempDir | 라이프사이클 메서드 또는 테스트 메서드에서 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공하는 데 사용됨 . org.junit.jupiter.api.io패키지에 위치함. 이러한 필드는 상속됨. |
@ExtendWith | 확장을 선언적으로 등록하는 데 사용됩니다 . 이러한 주석은 상속됩니다. |
@RegisterExtension | 필드를 통해 확장을 프로그래밍 방식으로 등록하는 데 사용됩니다 . 이러한 필드는 상속됩니다. |
5.1.1. 메타 주석과 구성된 주석
JUnit Jupiter 주석은 메타 주석 으로 사용할 수 있습니다 . 즉, 메타 주석의 의미를 자동으로 상속 하는 자체 구성된 주석을 정의할 수 있습니다.
@Tag("fast")예를 들어, 코드베이스 전체에 복사하여 붙여넣는 대신 ( 태그 지정 및 필터링 참조) 다음과 같이 사용자 정의 구성된 주석을 만들 수 있습니다. 그런 다음 . 의 드롭인 대체로 사용할 수 있습니다 .@Fast@Fast@Tag("fast")
import org.junit.jupiter.api.Tag;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}
위에 작성했던 MyFirstJunitJupiterTest 파일에 아래 구분을 추가하여 확인한다
@Fast
@Test
public void myFastTest() {
}
또한, 및 를@FastTest 대체하여 사용할 수 있는 사용자 정의 주석을 도입하여 한 단계 더 나아갈 수도 있습니다 .@Tag("fast") @Test
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {
}
@FastTest
public void myFastTest() {
}
+ 어노테이션 종류 및 설명
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
public 타입 elementName() [default 값]
...
}
메타 어노테이션의 종류는 다음과 같다.
@Retention : 컴파일러가 어노테이션을 다루는 방법을 기술, 어느 시점까지 영향을 미치는지를 결정
RetentionPolicy.SOURCE : 컴파일 전까지만 유효
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM에 의해 참조가 가능(리플렉션)
@Target : 어노테이션 적용할 위치 선택
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
@Documented : 해당 어노테이션을 Javadoc에 포함시킴
@Inherited : 어노테이션의 상속을 가능하게 함
@Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함
5.2.Definitions
a node in the test tree that contains other containers or tests as its children (e.g. a test class).
Test
a node in the test tree that verifies expected behavior when executed (e.g. a @Test method).
any method that is directly annotated or meta-annotated with @BeforeAll, @AfterAll, @BeforeEach, or @AfterEach.
Test Classany top-level class, static member class, or @Nested class that contains at least one test method, i.e. a container. Test classes must not be abstract and must have a single constructor. Java record classes are supported as well.
Test Methodany instance method that is directly annotated or meta-annotated with @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, or @TestTemplate. With the exception of @Test, these create a container in the test tree that groups tests or, potentially (for @TestFactory), other containers.
.
참조
1. https://junit.org/junit5/docs/current/user-guide/
JUnit 5 User Guide
Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo
junit.org
[Java] 어노테이션 (+커스텀 어노테이션 만들기)
자바 어노테이션에 대한 간략한 이해와 커스텀 어노테이션 만들어서 사용하는 법을 araboza
velog.io