JUnit5란?
자바 개발자가 가장 많이 사용하는 테스팅 프레임워크이다.
Java 8 이상에서 사용 가능하다.
JUnit5는 크게 세 개의 모듈로 구성되어 있다. (JUnit4는 단일 jar)
JUnit Platform
: TestEngine 인터페이스를 정의한다. TestEngine을 통해 테스트를 발견하고, 실행하고, 결과를 보고한다.JUnit Jupiter
: TestEngine 구현체 / Jupiter API(Junit5를 위한 테스트 API)를 사용해 작성한 테스트 코드를 실행할 때 사용한다.JUnit Vintage
: TestEngine 구현체 / 기존 JUnit3,4 버전으로 작성한 테스트 코드를 실행할 때 사용된다.
JUnit5 Gradle 의존성
Junit Jupiter API를 사용해 테스트를 작성하고 실행하려면,
(Gradle의 경우) build.gralde
에 junit-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를 사용하는 이유는 이전 포스팅에서 확인할 수 있다.
'프로그래밍' 카테고리의 다른 글
[Java] LinkedHashMap (0) | 2023.03.13 |
---|---|
[Java] 함수형 인터페이스와 람다 (5) | 2023.03.12 |
[Java] 복사와 불변 (new, unmodifiable, copyOf) (2) | 2023.02.24 |
[Java] 동일성(==)과 동등성(equals) (8) | 2023.02.23 |
AssertJ를 사용하는 이유 (0) | 2023.02.17 |