상세 컨텐츠

본문 제목

What is JUnit? (Unit test framework for java)

web/Spring & framework tool

by 매일매일 배우는 개발자 2021. 2. 3. 13:21

본문

728x90

JUnit이란 자바에서 사용되는 단위 모듈 테스트를 위한 프레임 워크이다. 소스코드의 모듈이 정확히 작동하는지 검증하기 위해 필요하다.

 

junit.org/junit5/ (홈페이지지)

 

JUnit 5

The JUnit team uses GitHub for version control, project management, and CI.

junit.org

github.com/junit-team/junit5/ (소스코드)

 

junit-team/junit5

✅ The 5th major version of the programmer-friendly testing framework for Java and the JVM - junit-team/junit5

github.com

JUnit의 특징

  • JAVA용 단위 테스트 프레임워크이다.
  • Java8버전 이상이 필요합니다.
  • @annotation으로 편하게 테스트를 할 수 있습니다.
  • JUnit5 부터 JUnit Platform + JUnit Jupiter + JUnit Vintage 의 모듈로 구성됩니다.
  • JUnit Platform : JUnit 플랫폼 을위한 기초 역할을 테스트 프레임 워크 실행 은 JVM에 있습니다. 플랫폼에서 실행되는 테스트 프레임 워크를 개발하기위한 API를 정의합니다 
  • JUnit Jupiter :  JUnit 5에서 테스트 및 확장을 작성하기위한 새로운 프로그래밍 모델  확장 모델 의 조합입니다
  • JUnit Vintage : JUnit 3 및 JUnit 4 기반 테스트를 실행 하기 위한을 제공합니다

 

메이븐에 JUnit5 버전 추가하기 (설치하기)

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

 

사용방법

class MyFirstJUnitJupiterTests {

    private final Calculator calculator = new Calculator();

    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }

}

메서드 위에 @Test 와 같이 annotation (어노테이션)기호를 붙여 사용한다.

 

 

주석기술

주석  

@Test

메서드가 테스트 메서드임을 나타냅니다. 
JUnit 4의 @Test어노테이션 과 달리이 어노테이션은 JUnit Jupiter의 테스트 확장이 자체 전용 어노테이션을 기반으로 작동하기 때문에 속성을 선언하지 않습니다. 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@ParameterizedTest

메서드가 매개 변수 가있는 테스트 임을 나타냅니다 . 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@RepeatedTest

메서드가 반복 테스트를 위한 테스트 템플릿임을 나타냅니다 . 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@TestFactory

메서드가 동적 테스트를 위한 테스트 팩토리임을 나타냅니다 . 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@TestTemplate

메서드가 등록 된 공급자가 반환 한 호출 컨텍스트 수에 따라 여러 번 호출되도록 설계된 테스트 케이스  템플릿 임을 나타냅니다 . 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@TestMethodOrder

주석이 달린 테스트 클래스에 대한 테스트 메서드 실행 순서 를 구성하는 데 사용됩니다 . 
JUnit 4의 @FixMethodOrder. 이러한 주석은 상속 됩니다.

 

@TestInstance

주석이 달린 테스트 클래스에 대한 테스트 인스턴스 수명주기 를 구성하는 데 사용됩니다 . 이러한 주석은 상속 됩니다.

 

@DisplayName

테스트 클래스 또는 테스트 메서드에 대한 사용자 지정 표시 이름  선언합니다 . 이러한 주석은 상속 되지 않습니다 .

 

@DisplayNameGeneration

테스트 클래스에 대한 사용자 지정 표시 이름 생성기  선언합니다 . 
이러한 주석은 상속 됩니다.

 

@BeforeEach

주석 메소드가 실행되어야 함 전에 실행
각각 @Test , @RepeatedTest, @ParameterizedTest, 또는 @TestFactory현재의 메소드; JUnit 4의 @Before. 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@AfterEach

주석 메소드가 실행되어야 함 후에  실행
각각 @Test , @RepeatedTest, @ParameterizedTest, 또는 @TestFactory현재의 메소드; JUnit 4의 @After. 이러한 메서드는 재정의 되지 않는 한 상속 됩니다 .

 

@BeforeAll

주석 메소드가 실행되어야 함을 나타내고 전에 실행
모든 @Test , @RepeatedTest, @ParameterizedTest및 @TestFactory현재 클래스의 메소드; JUnit 4의 @BeforeClass. 이러한 메서드는 상속되고 ( 숨겨 지거나 재정의 되지 않는 한 ) 반드시 상속 되어야합니다 static( "클래스 별" 테스트 인스턴스 수명주기 가 사용 되지 않는 경우 ).

 

@AfterAll

주석 메소드가 실행되어야 함을 나타내고, 이후 실행
모든 @Test , @RepeatedTest, @ParameterizedTest및 @TestFactory현재 클래스의 메소드; JUnit 4의 @AfterClass. 이러한 메서드는 상속 되며 ( 숨겨 지거나 재정의 되지 않는 한 ) 반드시 상속 되어야합니다 static( "클래스 별" 테스트 인스턴스 수명주기 가 사용 되지 않는 경우 ).

 

@Nested

주석이 달린 클래스가 정적이 아닌 중첩 테스트 클래스 임을 나타냅니다 . @BeforeAll및 @AfterAll방법은 직접 사용할 수 없습니다 @Nested은 "당 클래스"를 제외 테스트 클래스 테스트 인스턴스 라이프 사이클이 사용됩니다. 이러한 주석은 상속 되지 않습니다 .

 

@Tag

클래스 또는 메서드 수준에서 테스트 필터링을위한 태그 를 선언하는 데 사용됩니다 . TestNG의 테스트 그룹 또는 JUnit 4의 Categories와 유사합니다. 이러한 주석은 클래스 수준에서 상속 되지만 메서드 수준 에서는 상속 되지 않습니다.

 

@Disabled

테스트 클래스 또는 테스트 메서드  비활성화 하는 데 사용됩니다 . 
JUnit 4의 @Ignore. 이러한 주석은 상속 되지 않습니다 .

 

@Timeout

실행이 주어진 기간을 초과하는 경우 테스트, 테스트 팩토리, 테스트 템플릿 또는 수명주기 메서드를 실패하는 데 사용됩니다. 이러한 주석은 상속 됩니다.

 

@ExtendWith

확장을 선언적 으로 등록하는 데 사용됩니다 . 이러한 주석은 상속 됩니다.

 

@RegisterExtension

필드를 통해 프로그래밍 방식으로 확장  등록하는 데 사용됩니다 . 이러한 필드는 음영 처리 되지 않는 한 상속 됩니다 .

 

@TempDir

라이프 사이클 방법 또는 테스트 방법에서 필드 주입 또는 매개 변수 주입을 통해 임시 디렉토리  제공하는 데 사용됩니다 . 에있는 org.junit.jupiter.api.io패키지.

 

* 주로 BeforeAll, BeforeEach, Test, AfterEach, AfterAll를 쓴다.

 

Assertions 

JUnit Jupiter에 Assertion메소드이며 메소드 내부의 값을 확인할때 사용할 수 있다.

 

junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html

 

Assertions (JUnit 5.7.0 API)

Assert that all supplied executables do not throw exceptions. If any supplied Executable throws an exception (i.e., a Throwable or any subclass thereof), all remaining executables will still be executed, and all exceptions will be aggregated and reported i

junit.org

사용방법

@Test
    void standardAssertions() {
        assertEquals(2, calculator.add(1, 1));
        assertEquals(4, calculator.multiply(2, 2),
                "The optional failure message is now the last parameter");
        assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- "
                + "to avoid constructing complex messages unnecessarily.");
    }

assertEquals : 첫번쨰 매개변수와 두번쨰 매개변수가 같은지 비교하는 것이다.

 

 @Test
    void dependentAssertions() {
        // Within a code block, if an assertion fails the
        // subsequent code in the same block will be skipped.
        assertAll("properties",
            () -> {
                String firstName = person.getFirstName();
                assertNotNull(firstName);

                // Executed only if the previous assertion is valid.
                assertAll("first name",
                    () -> assertTrue(firstName.startsWith("J")),
                    () -> assertTrue(firstName.endsWith("e"))
                );
            },
            () -> {
                // Grouped assertion, so processed independently
                // of results of first name assertions.
                String lastName = person.getLastName();
                assertNotNull(lastName);

                // Executed only if the previous assertion is valid.
                assertAll("last name",
                    () -> assertTrue(lastName.startsWith("D")),
                    () -> assertTrue(lastName.endsWith("e"))
                );
            }
        );
    }

assertAll : assertions 을 그룹화하여 그룹안에서 assertions을 사용 할수 있다.

assertTrue : 특정조건이 참, 거짓인지 알아보는 것 이다.

 

※ 더 많은 메서드가 있으며 API안에서 찾아서 사용할 수 있다.

728x90

관련글 더보기