JUnit5, AssertJ 개요 및 사용법

yoondgu·2022년 11월 9일
0

Java 

목록 보기
15/18

✔️ JUnit 개요 및 구조

⚠️ 우아한테크코스 "바다"님의 10분 테코톡 영상 "바다의 JUnit5 사용법" 을 보고 정리한 내용입니다.

  • 단위 테스트 프레임워크로 자바 개발에서 대부분 이 프레임워크를 테스트 도구로 사용한다.
  • JUnit4 까지는 다른 라이브러리를 의존성으로 불러와서 참조하는 구조였지만 JUnit5부터는 그 자체로 모듈화가 되어있다.
    • JUnit Platform : 테스트코드를 실행해주는 런처를 제공

    • Jupiter, Vintage : 각각 JUnit5, JUnit3~4의 TestEngine api 구현체

      ⇒ 플랫폼을 통해 런처가 실행되고 버전에 따라 각각 Juptier, Vintage로 테스트가 진행된다.

  • 사용법
    • 스프링 부트 프로젝트는 2.2버전 이상부터는 자동으로 의존성이 추가된다.
    • 그 외의 경우에는 의존성을 직접 추가해주면 된다.

JUnit5 제공 Annotations

Jupiter에서는 테스트 및 확장된 기능을 위한 여러가지 어노테이션을 제공한다.

  • 테스트 어노테이션 @Test
    • 테스트 메서드라는 것을 나타냄
    • JUnit4에서는 속성 설정을 해주어야 했지만 5에서는 속성에 대한 별도 어노테이션이 존재하므로 이 어노테이션에서는 다른 속성을 작성할 필요 없음
  • 생명주기 어노테이션
    • @BeforeAll , @AfterAll 해당 클래스에 위치한 모든 테스트메서드 실행 전/후에 딱 한 번 실행되는 메서드
      • 테스트가 조건들에 대해 어떠한 변경도 하지 않는다는 확신이 있을 때 사용해야 한다.
    • @BeforeEach , @AfterEach 해당 클래스에 위치한 모든 테스트메서드 실행 전/후에 실행되는 메서드
      • 각 테스트가 조건들에 영향을 끼친다면 매 테스트 실행마다 조건들이 초기화될 수 있도록 이 어노테이션을 사용하는 것이 좋다.
      • 매 테스트 메서드마다 새로운 클래스를 생성하여 실행되므로 비효율적임.
    • @Disabled 테스트를 하고 싶지 않은 클래스나 메서드에 붙임
  • 테스트명 지정 DisplayName
    • 공백, Emoji, 특수문자 등 모두 지원
    • 테스트 결과에서 이름을 확인 가능
  • 반복 테스트 어노테이션
    • 특정 테스트 반복 RepeatedTest
      • 반복 횟수와 반복 테스트 이름을 설정 가능
      • displayName, currentRepetition, totalRepetitons를 이름에 사용 가능
    • 매개변수를 대입해가며 반복 ParameterizedTest
      • @CsvSource 를 이용해서 다양한 값을 매개변수로 줄 수 있다.
  • 테스트 계층화 @Nested
    • 테스트 클래스 안에서 내부 클래스를 정의함
    • 내부 클래스는 부모 클래스의 멤버 필드에 접근 가능
    • 생명주기 관계된 메소드들도 계층에 맞춰 동작함
    • 다양한 상황에 대해 테스트할 때 활용 가능

Assertions

“단정문”. 테스트 케이스의 수행 결과를 판별하는 메소드.

  • 모든 Junit Jupiter Assertions는 static 메소드임
  • JUnit에서는 기본적인 것만 제공함
    • assertEquals(expected, actual)

    • assertEquals(expected, actual, 오차범위)

    • assertArrayEquals(expected, actual) 배열의 일치여부

    • assertTrue(조건) 조건의 true 여부

    • assertNull(object) 객체 null 여부

    • assertNotNull(object)

  • JUnit5에 추가된 Assertions
    • assertAll(executables ...)
      • 매개변수로 받는 모든 테스트코드를 한번에 실행
      • 오류가 나도 끝까지 실행한 뒤 한번에 모아서 출력 ⇒ 발생 오류를 모아서 한번에 확인 가능
        (한 Assertion이 실패할 경우 나머지가 실행되지 않는 불편함을 해결)
    • assertThrows(expectedType, executable)
      • 예외 발생을 확인하는 테스트 수행
      • JUnit4까지는 단순히 테스트메소드에 기대하는 예외를 기술하는 방식으로 발생 여부만 검증할 수 있었다. 하지만 이 어노테이션을 이용하면 발생을 검증하고 예외의 상태까지 검증할 수 있다.
      • asserDoesNotThrow 도 사용 가능하다.
    • assertTimeout(duration, executable)
      • 특정 시간 내에 실행이 완료되는지 확인하는 단정문

Assumption

“전제문”. 전제문이 true라면 테스트를 실행, false라면 테스트를 종료함

전제문이 false일 때

  • assumeTrue : 이후의 테스트 전체가 실행되지 않음
  • assumingThat : 파라미터로 전달된 코드블럭만 실행되지 않음

✔️ assertJ

자바 테스트를 위해 개발된 오픈소스 라이브러리.

assertion을 제공하는 라이브러리로, 좀 더 풍분한 문법을 사용할 수 있고 메서드 체이닝을 통해 직관적인 테스트 흐름을 작성할 수 있게 해준다.

사용법

AssertJ에서 모든 테스트 코드는 assertThat(testTarget) 으로 시작한다.

  • assertThat 메소드에 테스트 대상을 파라미터로 전달하면 여러가지 메소드를 호출할 수 있으며, 메소드체이닝을 지원한다.
@Test
    void 문자열테스트() {
        assertThat("Hello, world!")
                .isNotEmpty()
                .contains("Hello")
                .doesNotContain("ZZZ")
                .isEqualTo("Hello, world!");
    }

✔️ IDE에서 테스트 실행하기 (intelliJ)

  1. 테스트 코드를 위한 디렉터리 생성

    프로젝트 우클릭 - New - Driectory

  2. 테스트 소스 디렉터리 지정

    프로젝트 우클릭 - Open Module Settings - 1번에서 생성한 디렉터리를 테스트 소스 디렉터리로 지정한다.

  3. Junit, Assertj 라이브러리 추가

  4. 테스트코드 작성

  5. 테스트 코드에서 실행하고자 하는 테스트 메서드의 이름을 우클릭하여
    Run ‘메소드명’ 클릭

💡 테스트 시 목록이 보이게 하려면 intellij에서 Gradle이 아닌 IntelliJ IDEA를 기준으로 Test를 진행하도록 하면 된다. Gradle 빌드도구로 테스트를 하기 때문에 IntelliJ에서 결과만 보이는 것. (Preferences - gradle - Run tests using)
참고링크
또, 아래 화면처럼 시계 아이콘을 클릭하면 과거의 테스트 이력을 확인할 수 있다.

0개의 댓글