카테고리 없음

Spring TestCode Junit 공부

한둥둥 2024. 1. 20. 17:15

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

- 테스트 클래스 또는 테스트 메서드에 대한 사용자 지정 표시 이름을 정해줄 때 사용됩니다.