티스토리 뷰

Study/Java

[스터디 4주차] JUnit5

나갱 2022. 1. 2. 23:26

JUnit5란?

자바 개발자가 많이 사용하는 테스팅 기반 프레임워크이다. JUnit은 자바 8 이상부터 사용 가능하며,  JUnit Platform과 JUnit Jupiter, Junit Vintage 결합한 형태라고 볼 수 있다. 

(JUnit5 =  JUnit Platform + JUnit  Jupiter  + Junit Vintage)

- JUnit Platform: 테스트를 실행해 주는 런처와 TestEngine API를 제공한다.

- Jupiter: TestEngine API 구현체로 JUnit5에서 제공한다.

- Vintage: TestEngine API 구현체로 JUnit3, 4에서 제공한다.

 

Write Test

JUnit Annotation

JUnit5 어노테이션 내용 JUnit4 어노테이션
@Test 테스트 Method임을 선언함. @Test
@ParameterizedTest 매개변수를 받는 테스트를 작성할 수 있음.  
@RepeatedTest 반복되는 테스트를 작성할 수 있음.  
@TestFactory @Test로 선언된 정적 테스트가 아닌 동적으로 테스트를 사용함.  
@TestInstance 테스트 클래스의 생명주기를 설정함.  
@TestTemplate 공급자에 의해 여러 번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타냄.  
@TestMethodOrder 테스트 메소드 실행 순서를 구성하는데 사용함.  
@DisplayName 테스트 클래스 또는 메소드의 사용자 정의 이름을 선언할 때 사용함.  
@DisplayNameGeneration 이름 생성기를 선언함. 예를 들어 '_'를 공백 문자로 치환해주는 생성기가 있음. ex ) new_test -> new test  
@BeforeEach 모든 테스트 실행 전에 실행할 테스트에 사용함. @Before
@AfterEach 모든 테스트 실행 후에 실행한 테스트에 사용함. @After
@BeforeAll 현재 클래스를 실행하기 전 제일 먼저 실행할 테스트 작성하는데,  static로 선언함. @BeforeClass
@AfterAll 현재 클래스 종료 후 해당 테스트를 실행하는데,  static으로 선언함. @AfterClass
@Nested 클래스를 정적이 아닌 중첩 테스트 클래스임을 나타냄.  
@Tag 클래스 또는 메소드 레벨에서 태그를 선언할 때 사용함.  이를 메이븐을 사용할 경우 설정에서 테스트를 태그를 인식해 포함하거나 제외시킬 수 있음.  
@Disabled 이 클래스나 테스트를 사용하지 않음을 표시함. @Ignore
@Timeout 테스트 실행 시간을 선언 후 초과되면 실패하도록 설정함.  
@ExtendWith 확장을 선언적으로 등록할 때 사용함.  
@RegisterExtension 필드를 통해 프로그래밍 방식으로 확장을 등록할 때 사용함.  
@TempDir 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공하는데 사용함.  

JUnit의 사용자 정의 어노테이션(Annotation)

JUnit jupiter의 어노테이션은 메타 어노테이션으로 사용할 수 있다. 예를 들어 @Tag("fast")를 매번 사용하는 대신 @Fast로 대체할 수 있다. 메타 어노테이션은 자신이 직접 annotation을 정의할 수 있다는 것을 의미한다. 

(1) Fast Annotation

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}

(2) Test Method

@Fast
@Test
void myFastTest() {
    // ...
}

@Fast와 @Test를 합친 @FastTest도 선언이 가능하다. 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {}

 

테스트 클래스와 테스트 메소드 

  • Test Class : 최소한 하나의 테스트 메소드가 포함된 정적 메소드 클래스 또는 중첩 클래스이다. 테스트 클래스는 추상 클래스가 되면 안되고 하나의 생성자는 꼭 가져야 한다.
  • Test Method : @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate가 어노테이션된 메소드이다.
  • Lifecycle Method : @BeforeAll, @AfterAll, @BeforeEach, or @AfterEach가 어노테이션된 메소드이다.
  • Test Method와 Lifecycle Method는 현재 클래스 내에서 선언되거나, 슈퍼클래스에 상속되거나, 인터페이스에서 상속 될 수 있다. 
class CalculatorTest {

    Calculator c = new Calculator();
    int a = 20;
    int b = 10;

    @BeforeAll
    static void start(){
        System.out.println("start!");
    }

    @BeforeEach
    void methodStart(){
        System.out.println("method start");
    }

    @Test
    @DisplayName("SUM")
    void sum() {
        assertEquals(30,c.sum(a,b));
    }

    @Test
    @Disabled()
    void sub() {
        assertEquals(10,c.sub(a,b));
    }

    @Test
    void mul() {
        assertEquals(200,c.mul(a,b));
    }

    @Test
    void div() {
        assertEquals(2,c.div(a,b));
    }

    @ParameterizedTest
    @ValueSource(ints = {2,4,6,8})
    void paramTest(int num){
        assertEquals(0,num%2);
    }

    @AfterEach()
    void methodFinish(){
        System.out.println("method finish");
    }

    @AfterAll()
    static void finish(){
        System.out.println("finish");
    }
}

Assert Method

  • assertEquals(x,y) : 객체 x,y가 일치함을 확인한다.
  • assertArayEquals(a,b) : 배열 A와 B가 일치함을 확인한다.
  • assertFalse(x) : x가 false인지 확인한다.
  • assertTrue(x) : x가 True인지 확인한다.
  • assertNull(x) : 객체 x가 null인지 확인한다.
  • seertNotNull(x) : 객체 x가 null이 아닌지 확인한다.
  • assertSame(x,y) : 객체 x와 y가 같은 객체의 레퍼런스임을 확인한다. (30 != 30.0)
  • asswertNotSame(x,y) : 객체 x와 y가 같은 객체의 레퍼런스가 아닌지 확인한다.
  • asserfail() : 테스트를 실패 처리한다.
 

 

댓글