JUnit5

박동규·2021년 5월 31일
0

인프런 백기선님의 더 자바, 애플리케이션을 테스트하는 다양한 방법 강좌를 학습하며 정리한 내용입니다.

JUnit5

JUnit이란?

  • Java에서 독립 된 단위테스트(Unit Test)를 지원해주는 프레임워크 이다.

JUnit 특징

  • 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별한다. (ex: assertEquals(예상값, 실제값))
  • @Test 메서드를 호출할 때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다. (테스트 메서드끼리 영향을 주는 상황을 방지하기 위해)

JUnit 5 소개

  • 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크
    • 단위 테스트를 작성하는 자바 개발자 93%가 JUnit을 사용
  • 자바 8 이상을 필요로 함.


Platform: 테스트를 실행해주는 런처 제공. TestEngine API 제공.
Jupiter: TestEngine API 구현체로 JUnit 5를 제공.
Vintage: JUnit 4와 3을 지원하는 TestEngine 구현체.

기본 어노테이션

  • @Test
    테스트를 실행할 메서드를 설정

  • @BeforeAll / @AfterAll
    @Test 어노테이션이 붙은 모든 테스트 메서드의 실행 전, 실행 후 실행

  • @BeforeEach / @AfterEach
    @Test 어노테이션이 붙은 각각의 테스트 메서드의 실행 전, 실행 후 실행

  • @Disabled
    테스트 메서드가 실행되지 않도록 설정

  • @DisplayName
    어떤 테스트인지 테스트 이름을 보다 쉽게 표현할 수 있는 방법을 제공

JUnit 5: Assertion

  • assertEquals(expected, actual)
    실제 값이 기대한 값과 같은지 확인

  • assertNotNull(actual)
    값이 null이 아닌지 확인

  • assertTrue(boolean)
    다음 조건이 참(true)인지 확인

  • assertAll(executables...)
    모든 확인 구문 확인

  • assertThrows(expectedType, executable)
    예외 발생 확인

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

JUnit 5: 조건에 따라 테스트 실행하기

특정한 조건을 만족하는 경우에 테스트를 실행하는 방법.

  • assumeTrue(조건)
  • assumingThat(조건, 테스트)

JUnit 5: 테스트 반복하기

  • @RepeatedTest
    반복 횟수와 반복 테스트 이름을 설정할 수 있다.
    • {displayName}
    • {currentRepetition}
    • {totalRepetitions}

-> RepetitionInfo 타입의 인자를 받을 수 있다.

  • @ParameterizedTest
    테스트에 여러 다른 매개변수를 대입해가며 반복 실행한다.
    • {displayName}
    • {index}
    • {arguments}
    • {0}, {1}, ...
  • 인자값들의 소스
    @ValueSource
    @NullSource, @EmptySource, @NullAndEmptySource
    @EnumSource
    @MethodSource
    @CvsSource
    @CvsFileSource
    @ArgumentSource
  • 인자 값 타입 변환
    • 암묵적인 타입 변환
    • 명시적인 타입 변환
      SimpleArgumentConverter 상속 받은 구현체 제공
      @ConvertWith
  • 인자 값 조합
    • ArgumentsAccessor
    • 커스텀 Accessor
      ArgumentsAggregator 인터페이스 구현
      @AggregateWith

JUnit 5: 테스트 인스턴스

JUnit은 테스트 메서드 마다 테스트 인스턴스를 새로 만든다.

  • 이것이 기본 전략이다.
  • 테스트 메서드를 독립적으로 실행하여 예상치 못한 부작용을 방지하기 위함이다.
  • 이 전략을 JUnit 5에서 변경할 수 있다.

@TestInstance(Lifecycle.PER_CLASS)

  • 테스트 클래스 당 인스턴스를 하나만 만들어 사용한다.
  • 경우에 따라, 테스트 간에 공유하는 모든 상태를 @BeforeEach 또는 @AfterEach에서 초기화 할 필요가 있다.
  • @BeforeAll과 @AfterAll을 인스턴스 메서드 또는 인터페이스에 정의한 default 메서드로 정의할 수도 있다.

JUnit 5: 테스트 순서

테스트 메서드는 내부적으로 정해진 특정한 순서에 의해 실행되지만 어떻게 그 순서를 정하는지는 의도적으로 정의하지 않는다.(테스트 인스턴스를 테스트 마다 새로 생성하는 것과 같은 이유이다.) 테스트를 실행할 때마다 테스트 메서드는 같은 순서로 실행되지만, JUnit 내부 구현 로직이 언제 바뀔지 알 수 없기 때문에 이 순서에 의존하여 코드를 작성하면 안된다.

하지만, 특정 순서대로 테스트 코드를 실행하고 싶을 때도 있을 것이다.(회원가입 -> 로그인 -> 개인 페이지 -> 닉네임 변경 등의 시나리오 테스트를 할 경우) 이러한 경우 테스트 메서드를 원하는 순서에 따라 실행하도록 @TestInstance(Lifecycle.PER_CLASS)와 함께 @TestMethodOrder()를 사용할 수 있다.

반드시 @TestInstance를 같이 사용해야 하는 것은 아니다. 상태 정보를 공유하면서 순차적인 테스트를 만들기 위해 함께 사용하라는 것.

  • () 안에 MethodOrderer 구현체를 설정한다.
  • 기본 구현체
    • Alphanumeric
    • OrderAnnotation
    • Random

0개의 댓글