기능 테스트
: 단위가 가장 큰 테스트. 주로 사용자 입장에서 애플리케이션이 제공하는 기능이 올바르게 동작하는지를 테스트한다.
일반적으로 테스트 전문 부서(QA 부서) / 외부 QA 업체 / Frontend 개발자가 테스트를 실행.
통합 테스트
: 클라이언트 측 툴 없이 개발자가 짜 놓은 테스트 코드를 실행시켜서 이루어진다. 개발자/개발팀이 테스트의 주체가 되는것이 일반적이다.
슬라이스(slice) 테스트
: 애플리케이션을 특정 계층으로 쪼개어서 하는 테스트
단위 테스트
: 주로 서비스 계층의 비즈니스 로직의 클래스들이 독립적으로 테스트하기 가장 좋은 대상이기 때문에 단위 테스트라고 부르는 경우가 가장 많다.
=> 주로 메서드 단위로 테스트코 드를 작성한다. 일반적으로 단위 테스트는 최대한 독립적인 것이 좋고, 최대한 작은 단위인 것이 더 좋다.
단위 테스트를 위한 F.I.R.S.T 원칙이라는 것이 존재하는데,
이는
Fast(빠르게)
,Independent(독립적으로)
,Repeatable(반복 가능하도록)
,Self-validating(셀프 검증이 되도록)
,Timely(시기 적절하게)
를 뜻한다.
여기서 Tiemly는 단위 테스트가 테스트 하려는 기능 구현을 하기 직전에 작성해야 한다는 의미이다. 구현하고자 하는 기능을 단계적으로 조금씩 업그레이드하면서 그때 그때 테스트 케이스 역시 단계적으로 업그레이드 하는 방식이 더 나은 경우가 많다.
Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 역할을 수행하는 Mocking 라이브러리
Mock 객체를 사용하면
=> 다른 계층에 의존하지 않고 특정 계층의 테스트만 수행 가능
@SpringBootTest
: SpringBoot 기반의 애플리케이션을 테스트하기 위한 ApplicationContext 를 생성해준다.
@AutoConfigureMockMvc
: Controller 테스트를 위한 애플리케이션의 자동구성 작업을 수행해주며, MockMvc 같은 기능을 사용하기 위해서는 이 애너테이션을 반드시 추가해 주어야 한다.
MockMvc
: 일종의 Spring MVC 테스트 프레임워크이며, WAS 없이 Controller 테스트 환경을 제공한다. 해당 객체를 사용하여 Controller 테스트를 진행할 수 있다.
@MockBean
: ApplicationContext 에 등록되어 있는 Bean 에 대한 Mockito Mock 객체를 생성하고 주입하여 가짜 Mock 객체를 생성해준다.
Mockito가 제공하는 given 메서드
를 이용하여 Stubbing 작업(임의의 객체를 만들어주는 작업)을 수행할 수 있다.
MockMvc 객체의 perform 메서드
를 이용하여 WAS 없이 Controller에 요청을 보낼 수 있다.
마지막으로 jsonPath 메서드
를 이용하여 요청에 대한 응답(response) 객체의 프로퍼티에 접근할 수 있으며, 이 값과 기대하는 값을 비교하여 올바른 응답이 왔는지 검증한다.
@ExtendWith(MockitoExtension.class)
: Spring을 사용하지 않고, JUnit에서 Mockito의 기능을 사용할 수 있도록 해준다. @SpringBootTest
애너테이션을 사용할 수도 있지만, 기본적으로 가벼운 단위테스트 시에는 적합하지 않기 때문에 사용하지 않는다.
@Mock
: mock 객체를 생성한다.
@InjectMocks
: 해당 애노테이션을 추가한 필드에 Mock 객체를 주입해준다.
여기서는 Mock 객체인 MemberRepository를 MemberService에 주입해준다.
@DataJpaTest
: Repository의 기능을 사용하기 위한 설정(Configuration)을 자동으로 추가해준다.
또한, @Transactional
애노테이션을 포함하고 있어, 각 테스트 종료시점에 테스트에 사용된 데이터들을 Rollback 해준다.