Spring TestCode Junit 공부
JUnit5 란?
Junit이란 자바 프로그래밍 언어용 단위 테스트 프레임워크입니다.
SpringBoot 2.2.0 이전에는 Junit4가 기본으로 설정되었지만, SpringBoot 2.2.0 버전 이후부터는 Junit5가 기본으로 설정된다.
Junit5는 런타임 시 , Java 8이상 필요하며, Junit5를 사용하려면 Gradle 4.7이상이여야 한다.
JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
- JUnit Platform: 테스트를 발견하고 테스트 계획을 생성하는 Test Engine API를 가지고 있다. Platform은 TestEngine을 통해서 테스트를 발견하고 실행하고 결과를 보고합니다.
- JUnit Jupiter: Test Engine의 실제 구현체는 별도 모듈이며, 모듈 중 하나가 jupiter-engine입니다. 이 모듈은 jupiter-api를 사용해서 작성한 테스트 코드를 발견하고 실행한다. Jupiter API는 JUnit 5에 새롭게 추가된 테스트 코드용 API로서, 개발자는 Jupiter API를 사용해서 테스트 코드를 작성할 수 있습니다.
- JUnit Vintage : JUnit 4버전으로 작성한 테스트 코드를 실행할 떄에는 vintage-engine 모듈을 사용한다.
단위 테스트란?
- 특정 단위의 함수, 모듈, 객체를 독립적으로 빠르게 자동화 하여 테스트하는 것을 말한다.
- 위 테스트에서는 독립적인 테스트를 위해 Mock 객체임 Stub을 활용하여 테스트한다.
통합 테스트란?
- 각 모듈 간에 메시지를 주고 받으며 올바르게 연계되어 동작하는지 검증한다.
- 캐시 메시지 큐등 외부 리소스를 실제로 모두 실행해 테스트해야한다.
단위 테스트의 필요성
- 통합 테스트만으로도 기능을 검증하는 것에는 문제가 없을 수 있는데 왜 단위 테스트를 수행해야 하는가?
- 테스트 코드의 목적은 해당 기능을 빠르게 검증 받고 이를 반복적으로 검증하여 빠르게 수정할 수 있는 것에 있지만 이는 통합 테스트에는 부적절하다.
@SpringBootTest는 @SpringBootApplication 어노테이션을 찾아서 모든 빈을 로드한다.
- 현업에서 테스트코드를 돌릴 떄에는 애플리케이션 규모가 크면 테스트가 많이 느려진다.
- class 속성을 이용하여 필요한 빈만 등록하는게 속도가 빠르다.
@Test
- 해당 어노테이션을 달아둔 메서드가 테스트 메서드임을 나타냅니다.
@BeforeEach
- 각각의 @Test, @RepeatedTest, @ParameterizedTest, @TestFatory전에 실행됩니다.
@AfterEach
- 각각의 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory 후에 실행됩니다.
@BeforeAll
- 모든 @Test, @RepatedTest, @ParameterizedTest, @TestFactory 전에 실행됩니다.
@ExtendWith
- 확장을 선언적으로 등록하는데 사용됩니다. Extendition뒤에 인자로 확장할 Extension을 추가하여 사용합니다.
- Spring을 사용할 경우 @ExtendWith(SpringExtension.class)와 같이 사용합니다.
@Disabled
- 테스트 클래스 또는 테스트 클래스 메서드를 비활성화하는데 사용됩니다.
@ParameterizedTest
- 메서드가 매개변수가 있는 테스트임을 나타냅니다.
@RepeatedTest
- 메서드가 반복 테스트를 위한 테스트 템플릿임을 나타냅니다.
@TestFactory
- 메서드가 동적 테스트를 위한 테스트 팩토리임을 나타냅니다.
@TestMethodOrder
- 테스트 메서드 실행 순서를 구성하는데 사용됩니다.
@DisplayName
- 테스트 클래스 또는 테스트 메서드에 대한 사용자 지정 표시 이름을 정해줄 때 사용됩니다.