JUnit5란?
Junit5는 가장 인기 있는 단위 테스트 Framework이다.
JUnit5 구성
JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform
테스트를 발견하고 테스트 계획을 생성하는 TestEngine 인터페이스를 정의하고 있다. Platform은 TestEngine을 통해서 테스트를 발견하고, 실행하고, 결과를 보고한다.
JUnit Jupiter
테스트 작성을 위한 새로운 프로그래밍 모델과 확장 모델 조합이다. 테스트 API와 실행 엔진을 제공한다.
JUnit Vintage
Junit 5에서 Junit 4와 Junit3가 동작할 수 있도록 지원한다.
Annotations
@BeforeAll
: 각각 @Test 메소드를 실행되기 전 매번 실행@AfterEach
: 각각 @Test 메소드가 실행된 후 매번 실행@BeforeAll
: 모든 @Test 메소드가 실행되기 전 한번 실행@AfterAll
: 모든 @Test 메소드가 실행된 후 한번 실행
주의 @BeforeAll, @AfterAll은 static으로 메소드를 실행해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class JUnitTest {
@BeforeAll
static void BeforeAll() {
System.out.println("@BeforeAll");
}
@BeforeEach
void BeforeEach() {
System.out.println("@BeforeEach");
}
@AfterEach
void AfterEach() {
System.out.println("@AfterEach");
}
@AfterAll
static void AfterAll() {
System.out.println("@AfterAll");
}
@Test
void successTest1() {
System.out.println("executes successTest1");
}
@Test
void successTest2() {
System.out.println("executes successTest2");
}
}
출력결과
1
2
3
4
5
6
7
8
@BeforeAll //처음 한번만 실행
@BeforeEach
executes successTest1
@AfterEach
@BeforeEach
executes successTest2
@AfterEach
@AfterAll //마지막 한번만 실행
@DisplayName
: TestClass나 TestMethod에 사용자 정의 이름 지정이 가능하다.
@DisplayName 추가 전 @DisplayName 추가 후@Disabled
: 테스트를 비활성화 시켜서 Skip하게 해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@DisplayName("테스트 진행")
@SpringBootTest
public class JunitTest {
@Disabled("Skip")
@DisplayName("테스트1")
@Test
void successTest1() {
System.out.println("executes successTest1");
}
@DisplayName("테스트2")
@Test
void successTest2() {
System.out.println("executes successTest2");
}
}
1
executes successTest2
아래 사진과 같이 테스트1이 Skip된 것을 확인 할 수 있다.
기능
Assumptions
assumeTrue, assumeFalse, assumingThat을 사용하면 특정 조건이 통과하지 못할 시 테스트를 중단할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("테스트 진행")
public class JunitTest {
@DisplayName("테스트1")
@Test
void successTest1() {
assumeTrue("test".equals("DEV"));
assertEquals(1, "a".length(), "is always equal");
}
@DisplayName("테스트2")
@Test
void successTest2() {
assumeFalse("test".equals("DEV"));
assertEquals(1, "a".length(), "is always equal");
}
@DisplayName("테스트3")
@Test
void successTest3() {
assumingThat("PRD".equals(System.getenv("ENV")),
() -> {assertEquals(1, "a".length(), "is always equal");
});
}
}
Exception Testing
assertThrows를 사용하여 예외를 담고 안에 담긴 메시지를 확인해볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("테스트 진행")
public class JunitTest {
@Test
void assertThrowsException() {
String str = null;
Exception exception = assertThrows(RuntimeException.class, () -> {
exception();
});
assertEquals("/ by zero", exception.getMessage());
}
void exception() throws Exception {
throw new RuntimeException("Message");
}
}