240613
오늘의 학습
● 1. 테스트 코드
● 2. 단위 테스트
● 3. Given - When - Then 패턴
● 4. Mockito
● 5. 자주 사용하는 애너테이션
테스트 코드를 작성하는 이유
테스트 코드를 작성하지 않고 배포를 진행했다가 추후에 문제가 생기면 사용자에 대한 비용과 운영환경에서의 비용이 기하급수적으로 증가하기 때문에 이러한 문제를 미연에 방지하고자 테스트 코드를 작성하는 것이다.
결제 시스템과 같이 버그나 문제가 생겼을 때 비용이 많이 드는 기능들은 반드시 테스트 코드를 작성을 해줘야 한다.
단위 테스트란?
작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하는 테스트 기법이다.
쉽게 말하면 하나의 기능(메서드)에 대해 독립적으로 진행되는 가장 작은 단위의 테스트를 의미한다.
JUnit5
자바 프로그래밍 단위 테스트 프레임워크 이다.
스프링부트 프로젝트 환경에서는 기본적으로 제공을 해주는 프레임워크이다.
Given - When - Then 패턴
- Given-When-Then 패턴은 Test Code 스타일을 표현하는 방식을 뜻합니다.
Given
- 테스트 하고자하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언해 둡니다.
When
- 테스트 하고자하는 대상을 실제로 실행 시킵니다.
Then
- 어떤 특정한 행동(테스트 대상 실행) 때문에 발생할거라고 예상되는 결과에 대해 예측하고 맞는지 확인합니다.
Mockito
Mock Object ( 가짜 객체 ) 를 제공한다.
각 테스트 케이스는 서로 분리가 되어야 한다.
이러한 과정을 해주는 라이브러리 Mockito 라이브러리 인 것이다.
Mockito 라이브러리는 스프링부트 프로젝트의 JUnit5 처럼 기본적으로 내장이 되어있다.
통합 테스트
단위는 하나의 메서드 클래스 세세한 부분 테스트 가능 모듈간의 상호작용 검증 불가능
반면에 통합 테스트는 두 개 이상 연결된 모듈간의 테스트가 가능하다.
1. @BeforeEach
해당 애너테이션은 각각의 테스트 코드가 실행되기 전에 애너테이션이 붙은 해당 메서드를 먼저 실행을 시켜준다.
@BeforeEach
void setUp() {
System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
}
2. @AfterEach
각각의 테스트 코드가 실행된 후 애너테이션이 붙은 해당 메서드를 실행을 시켜준다.
@AfterEach
void tearDown() {
System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
}
3. @BeforeAll
모든 테스트 코드가 실행되기 전에 최초로 한번 해당 메서드를 수행을 시켜 준다.
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
}
4. @AfterAll
모든 테스트 코드가 실행된 후 마지막으로 해당 메서드를 수행을 시켜 준다.
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
}
5. @DisplayName / 테스트 네이밍
테스트의 내용을 한눈에 알아볼 수 있게 네이밍을 해주는 애너테이션이다.
@Test
@DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 수 있습니다.")
void test1() {
System.out.println("테스트의 수행 내용들을 빠르게 파악할 수 있습니다.");
}
6. @Nested / 테스트 그룹
테스트를 그룹으로 지어 보기 좋게 해주는 애너테이션이다.
애너테이션 범위는 클래스 범위이다. 해당 애너테이션은 주로 테스트를 할 클래스 내부의 내부클래스를 만들어 해당 내부클래스에 애너테이션을 붙히면 그 내부클래스 안에 Test 메서드들은 하나의 그룹으로 묶이게 된다.
@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
class Test1 {
@Test
@DisplayName("Test1 - test1()")
void test1() {
System.out.println("Test1.test1");
}
@Test
@DisplayName("Test1 - test2()")
void test2() {
System.out.println("Test1.test2");
}
}
@Nested
@DisplayName("Test2 다른 주제")
class Test2 {
@Test
@DisplayName("Test2 - test1()")
void test1() {
System.out.println("Test2.test1");
}
@Test
@DisplayName("Test2 - test2()")
void test2() {
System.out.println("Test2.test2");
}
}
7. @Order / 테스트 순서 지정
테스트의 순서를 지정해주는 애너테이션으로 해당 테스트 클래스의 그룹 내부에서의 실행 순서를 지정해 줄 수 있다.
@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class Test1 {
@Order(1)
@Test
@DisplayName("Test1 클래스")
void test() {
System.out.println("\nTest1 클래스");
}
@Order(3)
@Test
@DisplayName("Test1 - test1()")
void test1() {
System.out.println("Test1.test1");
}
@Order(2)
@Test
@DisplayName("Test1 - test2()")
void test2() {
System.out.println("Test1.test2");
}
}
# 오늘의 회고
오늘은 단위 테스트와 통합 테스트에 대해 공부를 하였고, 테스트 코드를 어떠한 방식으로 짜는지 까지 알아보았다.
컨트롤러 테스트를 위해선 @WebMvcTest 애너테이션을 이용하고, 일반 서비스 테스트에서 Mock을 사용하고자 한다면
클래스 범위에 @ExtendWith(MockitoExtension.class) 애너테이션을 사용하면 된다.
@WebMvcTest의 같은 경우에는 컨트롤러를 테스트 하기 위함이므로 서버 구동 시 스프링 컨테이너가 활성화가 되어있는 상태이다. 즉, 일반 @Mock 애너테이션은 이용이 불가능하다. 의존성을 주입 시켜줘야 하기 때문에 spring의 애너테이션인
@MockBean 애너테이션을 이용하여 가짜 Bean을 해당 컨트롤러에 주입을 시켜줘야 한다. 또한, 일반 @Mock 애너테이션 같은 경우에는 Service나 일반 테스트를 할 때 이용되며 스프링 컨테이너가 활성화가 되기전에 테스트 진행이 가능하다.
@Mock 은 가짜 객체를 만들어서 주입을 시켜주는 역할을 한다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 42일차 TIL - 톰캣, 서블릿 (0) | 2024.06.17 |
---|---|
내일배움캠프 41일차 TIL - Spring AOP (0) | 2024.06.14 |
내일배움캠프 39일차 TIL - 소셜 로그인 API(OAuth) (0) | 2024.06.12 |
내일배움캠프 38일차 TIL - 뉴스피드 프로젝트 (0) | 2024.06.12 |
내일배움캠프 37일차 TIL - 시큐리티 수정 중 (2) | 2024.06.10 |