Junit5 모듈 구성
Junit5는 크게 세 개의 요소로 구성되어 있다.
JUnit 플랫폼: 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공한다.
JUnit 주피터(Jupiter): JUnit5를 위한 테스트 API와 실행 엔진을 제공한다.
JUnit 빈티지(Vintage): Junit 3과 4로 작성된 테스트를 Junit5 플랫폼에서 실행하기 위한 모듈을 제공한다.
Junit5 는 테스트를 위한 API로 주피터 API를 제공한다.
@Test 애노테이션과 테스트 메서드
JUnit 모듈을 설정했다면 JUnit을 이용해서 테스트 코드를 작성하고 실행할 수 있다.
Junit의 Assertions 클래스는 assertEquals() 메서드와 같이 값을 검증하기 위한 목적의 다양한 정적 메서드를 제공한다.
public class SumTest {
@Test
public void sum(){
int result = 2 + 3;
Assertions.assertEquals(5,result);
}
}
주요 단언 메서드
메서드 설명
메서드 | 설명 |
assertEquals(expected, actual) | 실제 값(actual)이 기대하는 값(expectec)과 같은지 검사한다. |
assertNotEquals(unexpected, actual) | 실제 값(actual)이 특정 값(unexpected)과 같지 않은지 검사한다. |
assertSame(Object expected, Object actual) | 두 객체가 동일한 객체인지 검사한다. |
assertNotSame(Object unexpected, Object actual) | 두 객체가 동일하지 않은 객체인지 검사한다. |
assertTrue(boolean condition) | 값이 true인지 검사한다. |
assertFalse(boolean condition) | 값이 false인지 검사한다. |
assertNull(Object actual) | 값이 null인지 검사한다. |
assertNotNull(Object actual) | 값이 null이 아닌지 검사한다. |
fail() | 테스트를 실패 처리한다. |
Exception관련 메서드
메서드 설명
메서드 | 설명 |
assertThrows(Class<T> expectedType, Executable excutable) | executable을 실행한 결과로 지정한 타입의 익셉션이 발생하는지 검사한다. |
assertDoesBotThrow(Executable executable) | executable을 실행한 결과로 익셉션이 발생하지 않는지 검사한다. |
경우에 따라 일단 모든 검증을 실행하고 그중에 실패한 것이 있는지 확인하고 싶을 때가 있다. 이럴때 사용할 수 있는 것이 assertAll() 메서드이다. 다음은 assertAll() 메서드의 사용 예이다.
assertAll(
() -> assertEquals(3,5/2),
() -> assertEquals(4,2*2),
() -> assertEquals(6,11/2)
);
테스트 라이프 사이클
@BeforeEach 애노테이션과 @AfterEach 애노테이션
jUnit은 각 테스트 메서드마다 다음 순서대로 코드를 실행한다.
- 테스트 메서드를 포함한 객체 생성
- (존재하면) @BeforeEach 애노테이션이 붙은 메서드 실행
- @Test 애노테이션이 붙은 메서드 실행
- (존재하면) @After 애노테이션이 붙은 메서드 실행
public class LifecycleTest {
public LifecycleTest(){
System.out.println("new LifecycleTest");
}
@BeforeEach
void setUp(){
System.out.println("setUp");
}
@Test
void a(){
System.out.println("A");
}
@Test
void b(){
System.out.println("B");
}
@AfterEach
void tearDown(){
System.out.println("tearDown");
}
}
결과
new LifecycleTest
setUp
A
tearDown
new LifecycleTest
setUp
B
tearDown
@BeforEach : 테스트를 실행하는데 필요한 준비 작업을 할 때 사용한다.
@AfterEach : 테스트를 실행한 후에 정리할 것이 있을 때 사용한다.
BeforeAll 애노테이션과 AfterAll 애노테이션
@BeforeAll : 정적 메서드에 붙이는데 이 메서드는 클래스의 모든 테스트 메서드를 실행하기 전에 한 번 실행된다.
@AfterAll : 클래스의 모든 테스트 메서드를 실행한 뒤애 실행된다. 이 역시 정적 메서드에 적용한다.
테스트 메서드간 실행 순서 의존과 필드 공유하지 않기
각 테스트 메서드는 서로 독립적으로 동작해야한다. 한 테스트 메서드의 결과에 따라 다른 테스트 메서드의 실행 결과가 달라지면 안 된다. 그런 의미에서 테스트 메서드가 서로 필드를 공유한다거나 실행 순서를 가정하고 테스트를 작성하지 말아야한다.
추가 애노티에션 : @DisplayName, @Disabled
@DisplayName : 테스트에 표시 이름을 붙일 수 있다.
@Disabled : 특정 테스트를 실행하지 않고 싶을 때 사용한다.
모든 테스트 실행 명령어
mvn test (래퍼를 사용하는 경우 mvnw test)
gradle test (래퍼를 사용하는 경우 gradlew test)
Reference.