JUnit5 Test

Java 단위테스트 프레임워크
SpringBoot 2.2.0부터 공식적으로 JUnit5를 지원

JUnit4와의 차이점

  • JDK버전 : Java8이상 (JUnit4 : Java5 이상)
  • Architecture : 3개의 하위 프로젝트 (JUnit4 : 단일 jar)
  • annotation 이름변경 가능
  • 기능 추가

given/when/then 패턴

1개의 단위테스트를 3가지 단계로 나누어 처리

  • given(준비): 어떠한 데이터가 준비되었을 때
  • when(실행): 어떠한 함수를 실행하면
  • then(검증): 어떠한 결과가 나와야 함
@DisplayName("에이 테스트")
@Test
void aTest() {
  // given

  // when

  // then
}

annotation

  • @Test : 테스트 메서드임을 명시
@Test
void test() {

}


  • @ParameterizedTest : 매개변수가 있는 테스트메서드임을 명시
@ParameterizedTest
@ValueSource(strings = { "taehee" })
void test(String name) {
    
}


  • @RepeatedTest : 반복되는 테스트임을 명시
@RepeatedTest(3)  // 3번 반복
void test() {
    
}


  • @TestFactory : 런타임에 생성되는 동적테스트임을 명시
    그 자체가 테스트라기보다는 테스트케이스를 위한 팩토리
@TestFactory
Collection<DynamicTest> dynamicTestsFromCollection() {
  return Arrays.asList(dynamicTest("1st dynamic test", () -> assertEquals(6, 3 * 2)),
                       dynamicTest("2nd dynamic test", () -> assertEquals(4, 2 * 2)));
}


  • @TestTemplate : 여러번 호출할 수 있게 설계된 테스트템플릿
  • @TestMethodOrder : 테스트메서드 실행순서 명시
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class HelloJavaTest {

  @Test
  @Order(2)
  void test2() {
      System.out.println("2");
  }

  @Test
  @Order(1)
  void test1() {
      System.out.println("1");
  }
}


  • @DisplayName : 테스트클래스나 메서드에 사용자지정 이름 명시 (default : method명)
class HelloJavaTest {

  @DisplayName("에이 테스트")
  @Test
  void aTest() {
  }

}
  • @DisplayNameGeneration : 테스트클래스에 사용자지정 이름 명시
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
class HelloJavaTest {

  @Test
  void aTest() {
  }

}


  • @BeforeAll : static, 클래스에 있는 모든 테스트 전에 한번 실행
  • @AfterAll : static, 클래스에 있는 모든 테스트 후에 한번 실행
  • @BeforeEach : 각 테스트 실행 전 한번씩 실행
  • @AfterEach : 각 테스트 실행 후 한번씩 식행
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class HelloJavaTest {

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

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

    @BeforeEach
    void beforeEach() {
        System.out.println("beforeEach");
    }

    @AfterEach
    void afterEach() {
        System.out.println("afterEach");
    }

    @Test
    void test1() {
        System.out.println("test1");
    }

    @Test
    void test2() {
        System.out.println("test2");
    }

    @Test
    void test3() {
        System.out.println("test3");
    }
}

결과

beforeAll

beforeEach
test1
afterEach

beforeEach
test2
afterEach

beforeEach
test3
afterEach

afterAll



설정

build.gradle (5.7.0 버전)

dependencies {
  testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.7.0'
}

이렇게 추가해도되고,

  • spring-boot-starter-web를 선택했다면 자동으로 spring-boot-starter-test 의존성이 추가
  • spring-boot-starter-test에 junit5가 기본적으로 있음



Reference
https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests

업데이트: