Spring Boot Testing
- 테스트-케이스까지 짜야 개발자다!
* 단위테스트 / 통합테스트
- 단위테스트 : 컨트롤러에서 다른 서비스를 부르는 경우 목 객체를 넣어야 한다-가짜객체 생성 후 행동 정의
- 통합테스트 : 두개 이상의 클래스를 한번에 테스트(일반적)
- 클래스를 외부 컴포넌트와 합쳐서 테스트
- 회귀 테스트(Regression Test)
- 에러가 발생한 환경을 구현해서 수정하는 테스트
- 장애가 발생시, 해당 환경을 구현하여 이를 해결한다!
* 테스트 케이스 짜는 규칙
1) 일단 빨라야한다(현업에서는 테스트케이스가 매우 많다!(1000개가 넘는데 하나당 30초씩 걸린다면?)), 서버가 죽었는데, 빌드에 30분 걸리면 안됨!
2) TC가 성공하는것은 계속 성공해야 하고, 실패하는 것은 계속 실패해야 한다(이전 TC와 연관을 가져서는 안된다)
3) 반복해서 같은 값을 가져야 한다
Spring-Boot-Test 설치
- spring boot는 테스트를 위한 다양한 애너테이션과 유틸리티를 제공한다.
- 테스트 지원은 spring-boot-test, spring-boot-test-autoconfigure 모듈로 제공된다.
- 개발자는 spring-boot-starter-test 의존성을 추가하여 설치할 수 있다
Spring-boot-starter-test에서 제공하는 라이브러리
JUnit 5 : @Test(메소드 위 사용) -> 단위테스트
@SpringBootTest : 전체 통합 테스트
- @SpringBootTest를 사용하면 실제 어플리케이션 기동시와 유사하게 전체 빈 설정이 로딩된다
@Autowired를 쓰면 test용으로 만든 applicationContext가 구동되서 Bean들을 가져오고, 의존하는 Bean들도 가져올 수 있게 된다.(단점 : 무겁다! 왜냐하면 모든 SpringBean을 다 가져오기 때문)
!Junit 5 를 쓸거면 @ExtendWith(SpringExtension.class)를 쓸 필요가 없다!
@SpringBootTest는 webEnvironment(default : Mock)를 설정해서 서버를 실행할 수 있다
MOCK : Servlet 환경을 말함(url로 요청이 들어오면 dispatcher servlet이 일치하는 controller로 mapping --> 을 mocking한 것으로 되어있음)
RAMDOM_PORT : applicationProperties에 server.port = N 해줘도 랜덤으로 적용
DEFINDED_PORT : 내가 설정한 포트로 동작
--> 결국 혼자 작업하는게 아니라 여러명이 동시에 빌드를 하게 되는 상황이 오는데, 그때 random port가 필요하다
@LocalServerPort << 주입 받을 수 있다...하지만 굳이?
private Integer port;
TestCase를 작성중 Post 메소드를 작성시 ObjectMapper는 content를 보낼때 사용된다. ObjectMapper는 ThreadSafe하지만, 비용이 많이 든다. 따라서 util로 따로 빼는게 더 좋다