JUnit
- JUnit: 자바 개발자가 가장 많이 사용하는 Testing 기반 프레임워크
- JUnit5: JAVA8 이상부터 지원
- 테스트 작성자를 위한 API, 테스트 실행을 위한 API가 분리되어 있음
- 이전 버전인 JUnit4와 비교해서 JUnit5는 3가지 모듈로 구성되어 있음
- JUnit Platform
- JVM에서 테스트 프레임워크를 실행하는데 기초를 제공
- TestEngine API를 제공해 테스트 프레임워크 개발 가능
- JUnit Jupiter
- TestEngine API 구현체 (JUnit5에서 제공)
- JUnit5에서 테스트를 작성하고 확장하기 위한 새로운 프로그래밍 모델과 확장 모델의 조합
- 테스트 코드 작성 모듈: junit-jupiter-api
- 테스트 실행 모듈: junit-jupiter engine
- JUnit Vintage
- TestEngine API 구현체 (JUnit3, 4에서 제공)
- 하위 호환성을 위해 JUnit3, JUnit4 기반으로 돌아가는 플랫폼에 테스트 엔진을 제공해줌
- JUnit Platform
JUnit5 구조
위에서 소개한 3가지 모듈을 도식화하면 아래와 같은 형태로 표현된다.
JUnit5 Annotation
Annotations
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 | 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공 |
Meta Annotation & Compose Annotation
JUnit Jupiter 어노테이션은 메타 어노테이션처럼 사용된다.
즉, 자동으로 메타 어노테이션을 상속하는 자신만의 컴포즈 어노테이션을 정의할 수 있다.
아래 예시를 통해 알아보자.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest{}
위와 같이 @Tag()와 @Test어노테이션을 커스텀 컴포즈 어노테이션으로 만들어 아래처럼 사용할 수 있다.
@FastTest
void fastTest(){}
Test Class, Test Method
테스트 클래스
1. 최상위 클래스, static 멤버 클래스, @Nested 클래스에 적어도 한개의 @Test어노테이션이 붙은 테스트 메소드가 포함되어 있는 클래스
2. 테스트 클래스는 abstract이면 안됨
3. 하나의 생성자가 있어야 함, 만들지 않으면 컴파일러 자동 생성
테스트 메소드
@Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate 같은 메타 어노테이션이 붙은 메소드
라이프 사이클 메소드
@BeforeAll, @AfterAll, @BeforeEach, @AfterEach 같은 메타 어노테이션이 붙은 메소드
테스트 메소드와 라이프 사이클 메소드는 테스트할 클래스, 상속한 부모 클래스 또는 인터페이스에 선언된다.
테스트 메소드와 라이프 사이클 메소드는 abstract 선언이 없어야 하고 어떤 값도 리턴되서는 안된다.
Jupiter API : Assertions
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() |
Junit5 Assumptions
- JUnit5에 새로 추가된 기능
- 특정 조건이 충족되는 경우에만 테스트
- 특정 profile, OS 에서만 테스트를 실행하는 경우 활용 가능
- 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 뿐만 아니라 원하는 조건을 넣어 위처럼 실행시킬 수 있다.
Reference
'Spring' 카테고리의 다른 글
소프트웨어 테스트 종류 (0) | 2023.02.10 |
---|---|
AssertJ 기본 사용법 (0) | 2023.02.10 |
QClass 사용법 (0) | 2023.02.10 |
QueryDsl 도메인 생성 (0) | 2023.02.10 |
Querydsl 설정 (0) | 2023.02.10 |