/inflean-java-test

인프런에서 JUnit5 강의들으면서 남기는 코드

Primary LanguageJava

JUnit5

  • @Test

    • 테스트 대상 메서드 어노테이션
  • @BeforeAll

    • 전체 테스트가 실행되기 전 실행되는 메서드
    • static 키워드 또는 @TestInstance가 필요하다.
  • @AfterAll

    • 전체 테스트가 실행된 후 실행되는 메서드
    • static 키워드 또는 @TestInstance가 필요하다.
  • @BeforeEach

    • 단위 테스트 전 실행 메서드
  • @AfterEach

    • 단위 테스트 후 실행 메서드
  • @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)

    • underscore를 빈칸으로 변환해주는 어노테이션
    • 테스트 클래스 위에 한 번만 작성한다.
  • @DisplayName

    • 테스트 메서드의 이름을 콘솔에서 출력할때 사용하는 이름

  • import static org.junit.jupiter.api.Assertions.*

  • Assert에서 에러 발생하면, 다음 Assertion으로 넘아가지 않음.

  • Assertions 관련 서드파티 라이브러리

  • assertNotNull()

    • 값이 null이 아닌지 확인
  • assertEquals()

  • 실제 값이 기대한 값과 같은지 확인

assertEquals

lambda식으로 메세지 작성한 모습

  • assertTrue()
    • 조건이 True인지 확인
  • assertAll()
    • Assertions 테스트 코드는 assertAll() 안에 넣어서 한 번에 테스트 가능.

AssertAll

  • assertThrows(expectedType, executable)

    • 특정 시간안에 실행이 완료되는지 확인
  • assertTimeout(duration, executable)

    • 특정 시간안에 실행이 완료되는지 확인
  • assertTimeoutPreemtively()

    • 테스트가 타임아웃이 발생하면 바로 종료하는 테스트 메서드
    • assertTimeoutPreemtively() 는 ThreadLocal을 사용하므로 예상하지 못한 상황이 발생할 수 있음. 유의해서 사용 필요.

Timeout


  • 운영체제

    • @DisabledOnOs(OS.WINDOWS)
      • 테스트 환경이 Window일 경우에는 disabled.
    • @EnabledOnOs({OS.LINUX, OS.MAC})
      • 테스트 환경이 리눅스, Mac이면 enabled.
  • JRE

    • @EnabledOnJre({JRE.JAVA_8, JRE.JAVA_9})

      • JAVA 8, JAVA 9에서만 테스트 실행
    • @DisabledOnJre({JRE.JAVA_14})

      • JAVA 14에서는 테스트 미실행
  • 환경변수

    • @EnabledIfEnvironmentVariable(named="TEST_ENV", matches = "LOCAL")
    • 로컬 환경변수의 TEST_ENV 가 LOCAL일 때 실행.

  • @Tag
    • IDE에서 configuration를 수정하여 태그 어노테이션으로 실행할 테스트 메서드 지정 가능


  • @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    • 테스트 클래스 상단에 어노테이션 맵핑을 한다.
    • Method에 Order 어노테이션을 추가하여 테스트 메서드를 순서정의하겠다는 어노테이션.
    • @Order()
      • 숫자를 넣어서 실행될 테스트 메서드 순서를 결정할 수 있다.

order


  • 라이프 사이클의 단위(class/method)를 설정할 수 있다.
  • @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    • PER_CLASS : 클래스 단위로 인스턴스 생성
  • @TestInstance(TestInstance.Lifecycle.PER_METHOD)
    • PER_METHOD : 메서드 단위로 인스턴스 생성
  • @BeforeAll, @AfterAll 과 같이 static 키워드가 필요한 메서드들도 static 키워드가 필요없게 된다.

  • 경로(src\test\resources)에 Junit 설정파일을 만들 수 있다.
  • IDE에서 이를 JUnit Resource로 인식하도록 인텔리J에서 설정이 필요하다.
    • [File] - [Project Structure] - [Modules] - [Test Resources]

junit-platform


Custom Tag

태그를 할 수도 있지만, 자동완성기능을 이용한 어노테이션으로 커스텀 태그를 만들어서 사용할 수도 있다. 이렇게 하면 테스트 코드를 작성하는 과정에서 오타를 내서 실수를 할 일을 없앨 수 있다.

먼저 테스트 클래스와 같은 디렉토리에 인터페이스를 만든다.

FastTest.java

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(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@Tag("fast")
public @interface FastTest {
}

위의 인터페이스는 FastTest 라는 이름의 커스텀 태그를 만들어낼 수 있다. 또 기존에 사용하던 fast 라는 이름의 Tag를 대신하는 커스텀 태그이다.

테스트 클래스로 돌아가서 방금 만든 인터페이스의 커스텀태그를 사용할 수 있게되었다.


테스트를 반복할 때 사용하는 어노테이션이다.

@RepeatedTest(10)
void repeatTest(RepetitionInfo repetitionInfo){
   System.out.println("test : "+repetitionInfo.getCurrentRepetition()+" of "
         +repetitionInfo.getTotalRepetitions());
}

@RepeatedTest() 에 인자값으로 숫자를 넣으면 해당 숫자만큼 테스트가 반복된다. 테스트가 진행되는동안 반복횟수를 콘솔에 띄워서 확인하고 싶다면, RepetitionInfo 객체의 인스턴스를 테스트 메서드의 인자값으로 받아서 띄워보면 된다.

getTotalRepetition() : 전체 횟수를 의미한다. @RepeatedTest() 에 넣은 인자값이 여기에서 출력된다.

getCurrentRepetitions() : 전체 반복 횟수중 현재 몇번째 loop인지를 알려준다.

아래는 반복 테스트 결과이다.


반복횟수를 보여주는 다른 방법도 있다.

@RepeatedTest 안에 속성으로 테스트의 이름과 반복횟수 등을 출력할 수도 있다.

@DisplayName("Hello Test")
@RepeatedTest(value = 10, name = "{displayName}, {currentRepetition}/{totalRepetitions}")
void repeatTest(RepetitionInfo repetitionInfo){
   System.out.println("test : "+repetitionInfo.getCurrentRepetition()+" of "
         +repetitionInfo.getTotalRepetitions());
}

테스트 결과이다. 이게 더 깔끔해보인다.


Parameterized Test

테스트를 반복할 때마다 파라미터를 바꿔주는 어노테이션이다.