[JUnit5] basic annotation, Display, Assertion

안수진·2024년 2월 2일

JUnit

목록 보기
1/2
post-thumbnail

☑️ 테스트 단축키

테스트 클래스 만들기
command + shift + T

특정 테스트 메서드 실행
해당하는 메서드 위치에 커서를 두고
ctrl + shift + R

✅ 테스트 코드 접근 지정자

class StudyTest {
  @Test
  void create(){
    Study study = new Study();
    assertNotNull(study);
  }
}

JUnit5 부터는 클래스나 테스트 메서드가 public일 필요가 없다.
자바에서 Reflection을 사용하면 이렇게 private하거나 default한 메서드에서 접근하고 실행이 가능해서 굳이 public일 필요가 없다.



🧐 Basic Annotaion

@BeforeAll

해당 테스트 클래스 안에 있는 여러 테스트가 모두 실행이 될때
이 모든 테스트를 실행하기 전에 반드시 딱 한번 호출된다.

static void method로 구현

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

@AfterAll

모든 테스트가 실행된 이후에 딱 한번만 호출된다.

static void method로 구현

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

@BeforeEach / @AfterEach

모든 테스트를 실행할 때 각각의 테스트를 실행하기 이전과 이후에 한번씩 호출된다.

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

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

예시


1. 모든 테스트를 실행하기 전에 @BeforeAll 한번 호출
2. @BeforeEach → test method → @AfterEach
3. @BeforeEach → 다른 test method → @AfterEach
4. 모든 테스트가 다 실행된 후 @AfterAll 한번 호출

@Disabled

실행하고 싶지 않은 테스트가 있는 경우 사용

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

@DisplayNameGeneration

  • Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법 설정.

    • class에서 사용시 클래스 내에 있는 모든 테스트 메서드에 적용됨
    • method에서 사용시 해당 테스트 메서드에만 적용됨
  • 기본 구현체로 ReplaceUnderscores 제공
    언더바를 빈 공백 문자로 치환

    @DisplayNameGeneration(ReplaceUnderscores.class)
    

@DisplayName

  • 어떤 테스트인지 테스트 이름을 보다 쉽게 표현할 수 있는 방법을 제공하는 애노테이션.
  • @DisplayNameGeneration 보다 우선 순위가 높다.

    이 방법을 더 권장한다.



🏳️ Assertion

우리가 실제 테스트에서 검증하고자 하는 내용을 확인하는 기능

메서드설명
assertEquals(expected, actual)실제 값이 기대한 값과 같은지 확인
assertNotNull(actual)값이 null이 아닌지 확인
assertTrue(boolean)다음 조건이 참(true)인지 확인
assertAll(executables...)모든 확인 구문 확인
assertThrows(expectedType, executable)예외 발생 확인
assertTimeout(duration, executable)특정 시간 안에 실행이 완료되는지 확인

마지막 매개변수로 Supplier<String> 타입의 인스턴스를 lamda 형태로 제공 가능
복잡한 메시지를 생성해야 하는 경우 사용하면 실패한 경우에만 해당 메시지를 만들게 할 수 있다.

@Test
void create_new_study(){
  Study study = new Study();
  assertNotNull(study);
  assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 DRAFT 상태어야 한다.");
  System.out.println("create");
}

그냥 문자열로 넘기면 안되나?

매번 Assertion의 메서드가 실행될때마다 테스트의 성공, 실패 여부 상관없이
메시지를 만들기 위한 문자열 연산이 실행된다.

즉, 문자열 연산의 비용이 걱정되는 메시지인 경우 람다 표현식으로 사용하는 것이 낫다.

성능을 신경쓰는 입장에서 조금 더 유리할 수 있다.

assertAll

테스트가 실패하는 부분을 모두 확인할 수 있다.

사용하지 않는 경우
assertEquals의 실패로 다음 테스트인 assertTrue의 성공 여부는 알 수 없다.

  @Test
  void create_new_study(){
    Study study = new Study(-10);
    assertAll(
        () -> assertNotNull(study),
        () -> assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 DRAFT 상태어야 한다."),
        () -> assertTrue(study.getLimit() > 0, "스터디 최대 참석 가능 인원은 0보다 커야한다.")
    );

  }

Assertion 말고

AssertJ, Hemcrest, Truth 등의 라이브러리를 사용할 수도 있다.
이건 취향 차이일듯


💡 조건에 따라 테스트 실행

@Enabled / @Disabled

  • @EnabledOnOs({OS.MAC, OS.LINUX})
    운영체제가 MAC, LINUX인 경우에만 실행하겠다.

  • @DisabledOnOs(OS.MAC)
    운영체제가 MAC인 경우 실행하지 않겠다

  • @EnabledOnJre({JRE.JAVA_8, JRE.JAVA_9, JRE.JAVA_10})
    java version이 8, 9, 10인 경우에만 실행하겠다.

  • IfSystemProperty, IfEnvironmentVariable, if


이 외에도 이런 것들을 사용해서

  • org.junit.jupiter.api.Assumptions.*
    • assumeTrue(조건)
    • assumingThat(조건, 테스트)

테스트를 좀 더 다양한 환경에서 선택적으로 실행할 수 있다.

profile
항상 궁금해하기

0개의 댓글