JUnit

Junit5 공식문서 정리 및 실습_1(정의)

nick-p 2024. 11. 14. 14:46

 

 

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

 

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

Platform Concepts
Container

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).

 

Jupiter Concepts
Lifecycle Method

any method that is directly annotated or meta-annotated with @BeforeAll, @AfterAll, @BeforeEach, or @AfterEach.

Test Class

any top-level class, static member class, o@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 Method

any 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

 

2. https://velog.io/@potato_song/Java-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

[Java] 어노테이션 (+커스텀 어노테이션 만들기)

자바 어노테이션에 대한 간략한 이해와 커스텀 어노테이션 만들어서 사용하는 법을 araboza

velog.io