위에서 소개한 3가지 모듈을 도식화하면 아래와 같은 형태로 표현된다.
JUnit5 | 내용 | JUnit4 |
---|---|---|
@Test | 테스트 Method임을 선언 | @Test |
@ParameterizedTest | 매개변수를 받는 테스트 | |
@RepeatedTest | 반복되는 테스트 | |
@TestFactory | @Test 로 선언된 정적 테스트가 아닌 동적으로 테스트를 사용 | |
@TestInstance | 테스트 클래스의 생명 주기를 설정 | |
@TestTemplate | 공급자에 의해 여러번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타냄 | |
@TestMethodOrder | 테스트 메소드 실행 순서를 구성 | |
@DisplayName | 테스트 클래스 or 메소드의 사용자 정의 이름을 선언 | |
@DisplayNameGeneration | 이름 생성기, 예를 들어 _ 를 공백 문자로 치환해주는 생성기 new_test -> new test | |
@BeforeEach | 각각의 테스트 실행 전 실행할 테스트, 목업 데이터 세팅 용도로 자주 사용 | @Before |
@AfterEach | 각각의 테스트 실행 후 실행할 테스트 | @After |
@BeforeAll | 현재 클래스를 실행하기 전 제일 먼저 실행할 테스트,static 으로 선언 | @BeforeClass |
@AfterAll | 현재 클래스 종료 후 실행할 테스트,static 으로 선언 | @AfterClass |
@Nested | 클래스를 정적이 아닌 중첩 테스트 클래스임을 나타냄 | |
@Tag | 클래스 또는 메소드 레벨에서 태그 선언, 메이븐 사용 시 설정에서 테스트를 태그에 따라 포함하거나 제외 가능 | |
@Disabled | 이 클래스나 테스트를 사용하지 않음 | @Ignore |
@Timeout | 테스트 실행 시간을 선언 후 초과되면 실패하도록 설정 | |
@ExtendWith | 확장을 선언적으로 등록 | |
@RegisterExtension | 필드를 통해 프로그래밍 방식으로 확장을 등록 | |
@TempDir | 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공 |
JUnit Jupiter 어노테이션은 메타 어노테이션처럼 사용된다.
즉, 자동으로 메타 어노테이션을 상속하는 자신만의 컴포즈 어노테이션을 정의할 수 있다.
아래 예시를 통해 알아보자.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest{}
위와 같이 @Tag()
와 @Test
어노테이션을 커스텀 컴포즈 어노테이션으로 만들어 아래처럼 사용할 수 있다.
@FastTest
void fastTest(){}
테스트 클래스
1. 최상위 클래스, static 멤버 클래스, @Nested
클래스에 적어도 한개의 @Test
어노테이션이 붙은 테스트 메소드가 포함되어 있는 클래스
2. 테스트 클래스는 abstract
이면 안됨
3. 하나의 생성자가 있어야 함, 만들지 않으면 컴파일러 자동 생성
테스트 메소드
@Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
, @TestTemplate
같은 메타 어노테이션이 붙은 메소드
라이프 사이클 메소드
@BeforeAll
, @AfterAll
, @BeforeEach
, @AfterEach
같은 메타 어노테이션이 붙은 메소드
테스트 메소드와 라이프 사이클 메소드는 테스트할 클래스, 상속한 부모 클래스 또는 인터페이스에 선언된다.
테스트 메소드와 라이프 사이클 메소드는 abstract
선언이 없어야 하고 어떤 값도 리턴되서는 안된다.
org.junit.jupiter.api.Assertions
: 값 검증을 위한 클래스, assert
로 시작하는 static 메서드 제공
Method Name | 비고 |
---|---|
assertEquals(expected, actual) | int, long 등 기본 타입과 Object에 대한 assertEquals 메서드 존재 |
assertNotEquals(expected, actual) | |
assertTrue(boolean condition) | |
assertFalse(boolean condition) | |
assertNull(Object actual) | |
assertNotNull(Object actual) | |
assertAll() | assert로 여러 개 검증할 때 사용 |
assertThrows(ArithmeticException.class() -> divide(100,0)) | 실행한 코드에서 특정 exception이 발생하는지 확인 |
fail() |
assumeTrue()
, assumeFalse()
, assumingThat()
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Assumptions;
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.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assumptions.*;
public class AssumptionTest {
@Test
@DisplayName("MacOs에서 실행")
void test_Mac() {
assumeTrue(System.getProperty("os.name").startsWith("Mac"));
assertEquals(3, 3);
}
@Test
@DisplayName("Window에서 실행")
void test_window() {
assumeTrue(System.getProperty("os.name").startsWith("Window"));
assertEquals(3, 3);
}
@Test
@DisplayName("조건부에서 실행")
void test_condition() {
String osName = System.getProperty("os.name");
assumingThat(
osName.startsWith("Mac"),
() -> assertNotEquals(1, 2)
);
assertEquals(3, 3);
}
}
위 예제에서는 OS에 따라 조건별로 테스트를 실행시켜보았다.
OS 뿐만 아니라 원하는 조건을 넣어 위처럼 실행시킬 수 있다.