1. Junit이란??
- 자바 개발자가 가장 많이 사용하는 테스팅 기반 프레임워크다.
- JUnit5은 자바8 이상부터 사용이 가능하다.
- Junit4가 단일 jar이었던거에 비해서, JUnit5는 크게 3가지 모듈로 구성되어있다.
- JUnit5는 테스트 작성자를 위한 API 모듈과 테스트 실행을 위한 API가 분리되어있다.
- 예를 들어, JUnit Jupiter는 테스트 코드 작성에 필요한 junit-jupiter-api 모듈과 테스트 실행을 위한 junit-jupiter-engine 모듈로 분리되어 있다.
2. Junit5 구조
- JUnit Platform: 테스트를 실행해주는 런처와 TestEngine API를 제공함.
- Jupiter: TestEngine API 구현체로 JUnit5에서 제공함.
- Vintage: TestEngine API 구현체로 JUnit3, 4에서 제공함.
3. Junit5 어노테이션
JUnit5 어노테이션 | 내용 | JUnit4 어노테이션 |
@Test | 테스트 Method임을 선언함. | @Test |
@ParameterizedTest | 매개변수를 받는 테스트를 작성할 수 있음. | |
@RepeatedTest | 반복되는 테스트를 작성할 수 있음. | |
@TestFactory | @Test로 선언된 정적 테스트가 아닌 동적으로 테스트를 사용함. | |
@TestInstance | 테스트 클래스의 생명주기를 설정함. | |
@TestTemplate | 공급자에 의해 여러 번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타냄. | |
@TestMethodOrder | 테스트 메소드 실행 순서를 구성하는데 사용함. | |
@DisplayName | 테스트 클래스 또는 메소드의 사용자 정의 이름을 선언할 때 사용함. | |
@DisplayNameGeneration | 이름 생성기를 선언함. 예를 들어 '_'를 공백 문자로 치환해주는 생성기가 있음. ex ) new_test -> new test | |
@BeforeEach | 모든 테스트 실행 전에 실행할 테스트에 사용함. | @Before |
@AfterEach | 모든 테스트 실행 후에 실행한 테스트에 사용함. | @After |
@BeforeAll | 현재 클래스를 실행하기 전 제일 먼저 실행할 테스트 작성하는데, static로 선언함. | @BeforeClass |
@AfterAll | 현재 클래스 종료 후 해당 테스트를 실행하는데, static으로 선언함. | @AfterClass |
@Nested | 클래스를 정적이 아닌 중첩 테스트 클래스임을 나타냄. | |
@Tag | 클래스 또는 메소드 레벨에서 태그를 선언할 때 사용함. 이를 메이븐을 사용할 경우 설정에서 테스트를 태그를 인식해 포함하거나 제외시킬 수 있음. | |
@Disabled | 이 클래스나 테스트를 사용하지 않음을 표시함. | @Ignore |
@Timeout | 테스트 실행 시간을 선언 후 초과되면 실패하도록 설정함. | |
@ExtendWith | 확장을 선언적으로 등록할 때 사용함. | |
@RegisterExtension | 필드를 통해 프로그래밍 방식으로 확장을 등록할 때 사용함. | |
@TempDir | 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공하는데 사용함. |
4. Jupiter API: assert 메서드
org.junit.jupiter.api.Assertions 클래스는 값 검증을 위한 assert로 시작하는 static 메서드를 제공하고 있다.
- assertEquals(expected, actual) : int, long 등 기본타입과 Object에 대한 assertEquals 메서드가 존재한다.
- assertNotEquals(Object unexpected, Object actual)
- assertTrue(boolean condition)
- assertFalse(boolean condition)
- assertNull(Object actual)
- assertNotNull(Object actual)
- assertAll() : assert로 여러개 검즘할 때 사용
- assertThrows(ArithmeticException.class, () -> divide(100,0)) : 실행한 코드에서 특정 익셉션이 발생하는지 확인
- fail()
5. JUnit5 Assumptions
JUnit5에 새로 추가된 기능으로 Assumptions이 있는데 특정 조건이 충족되는 경우에만 테스트를 할 수 있습니다.
- 특정 profile, OS에서만 테스트를 실행하는 경우에 활용 가능
- assumeTrue(), assumeFalse(), and assumingThat()
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
public class AssumptionTest {
@Test
@DisplayName("window에서 테스트 실행")
void runTest_IfWindonw() {
assumeTrue(System.getProperty("os.name").startsWith("Windows"));
assertEquals(2, 2);
}
@Test
@DisplayName("linux에서 테스트 실행")
void runTest_IfLinux() {
assumeTrue(() -> System.getProperty("os.name").startsWith("Linux"));
assertEquals(2, 2);
}
@Test
@DisplayName("지정한 가정을 충족한 경우 지정한 검증을 수행")
void runTest() {
String osName = System.getProperty("os.name");
assumingThat(
osName.startsWith("Linux"), // (1) 가정 boolean 또는 BooleanSupplier
() -> assertEquals(1, 2) // (2) 가정을 충족할 때 실행할 코드(Executable 타입)
);
assertEquals(1, 1); // (3)
}
}
REFERENCE
https://steady-coding.tistory.com/349
https://javacan.tistory.com/entry/JUnit-5-Intro
'Test' 카테고리의 다른 글
Mockito && 스프링부트 테스트 관련 어노테이션 정리 (0) | 2021.11.17 |
---|---|
무엇을 어떻게 테스트할 것인가 (feat : 권용근님) (0) | 2021.11.17 |
단위 테스트(Unit Test) (0) | 2021.11.17 |
테스트 종류 (0) | 2021.11.17 |
AssertJ 기본 사용법 (0) | 2021.11.15 |