프로그래밍

JUnit5란?

도둑탈을 쓴 애쉬 2023. 2. 20. 00:18

JUnit5란?

자바 개발자가 가장 많이 사용하는 테스팅 프레임워크이다.
Java 8 이상에서 사용 가능하다.

JUnit5는 크게 세 개의 모듈로 구성되어 있다. (JUnit4는 단일 jar)

출처: 자바캔 (https://javacan.tistory.com/entry/JUnit-5-Intro)

  • JUnit Platform: TestEngine 인터페이스를 정의한다. TestEngine을 통해 테스트를 발견하고, 실행하고, 결과를 보고한다.
  • JUnit Jupiter: TestEngine 구현체 / Jupiter API(Junit5를 위한 테스트 API)를 사용해 작성한 테스트 코드를 실행할 때 사용한다.
  • JUnit Vintage: TestEngine 구현체 / 기존 JUnit3,4 버전으로 작성한 테스트 코드를 실행할 때 사용된다.

JUnit5 Gradle 의존성

Junit Jupiter API를 사용해 테스트를 작성하고 실행하려면,

(Gradle의 경우) build.graldejunit-jupiter 의존을 추가해주면 된다.

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
}

JUnit5 사용하기

JUnit4는 public 메서드만 테스트 가능했던것과 달리, JUnit5는 public 메서드는 물론 default 메서드도 테스트 가능하다.

따라서 주로 메서드에 접근제어자를 붙여주지 않는다. (default)

어노테이션

@Test

함수를 테스트 함수로 만드는 방법은 간단한다.

메서드 위에 @Test 어노테이션만 추가해주면 된다.

@Test
void testMethod() {
    int a = 1;
    int b = 2;
    assertEquals(a + b, 3);
}

@DisplayName("어떠한 테스트")

테스트 클래스나 메서드의 표시 이름을 지정한다.

해당 어노테이션을 사용하지 않으면, 테스트 이름은 메서드 이름을 따라간다.

 

@DisplayNameGeneration

@Test 메서드 이름의 _를 공백으로 바꾼 값을 테스트 이름으로 지정할 때 사용한다.

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class JunitTest {
    ...
}

@BeforeEach

각각의 테스트 메서드가 실행되기 전 특정 작업을 수행해야 할 때 사용한다.

주로 테스트에 필요한 목업 데이터를 미리 세팅해주는 용도로 사용된다.

@AfterEach

각각의 테스트 메서드가 실행된 후 특정 작업을 수행해야 할 때 사용한다.

@BeforeAll과 @AfterAll

한 클래스의 모든 메서드가 실행 되기 전 / 실행 된 후 특정 작업을 수행해야할 때 사용한다.

@BeforeEach / @AfterEach각 테스트 메서드마다 실행되는 반면,

@BeforeAll / @AfterAll은 클래스 내 모든 테스트 메서드 실행 전후로 딱 한번만 실행된다.

@Disabled

테스트를 실행 대상에서 제외한다.

@Nested

중첩된 구조로 테스트를 구성할 때 사용한다.

중첩 테스트를 사용하면 상황이나 실행 부분을 별도 클래스로 분리해서 구현할 수 있다.

@Tag

테스트를 필터링할 때 사용한다. 클래스 또는 메서드레벨에 사용한다.

Assertions

다음과 같은 메서드들이 있다.

  • assertEquals(expected, actual)
  • assertNotEquals(unexpected, actual)
  • assertSame(Object expected, Object actual)
  • assertNotSame(Object unexpected, Object actual)
  • assertTrue(boolean condition)
  • assertFalse(boolean condition)
  • assertNull(Object actual)
  • assertNotNull(Obejct actual)
  • fail() : 테스트를 실패 처리한다.

단순한 메서드들만 제공하니, 서드파티 라이브러리인 AsssertJ를 사용하도록 하자.

AssertJ를 사용하는 이유는 이전 포스팅에서 확인할 수 있다.