이 글은 경험에서 우러나온 글이기 때문에 개인적인 의견이 존재할 수 있습니다.
직접 서버를 구동시켜 테스트를돌리는 것은은 매우 번거롭고시간이 오래 걸리며며,매뉴얼이이 존재하지 않으면 테스트마다 다른 결과값을 가질 수 있기 때문에 비효율적이다.
그나마 Postman을 이용하여 케이스별로 상태를 저장할 수 있어 빠른 테스트를 할 수 있다는 기대가 있다.
하지만 이 방법 또한 테스트용 서버를 직접 구동시킨 뒤, Postman에서 직접 API를 호출한 뒤, 결과값을 두 눈으로 메뉴얼 상의 기댓값과 비교를 해야 한다.
사람의 눈으로 직접 결과를 보며 테스트하기 때문에 테스트의 기댓값이 나오지 않더라도 놓칠 수 있기 마련이다.
직접 서버를 띄우고,,,,,Postman을 켜서 데이터를 집어넣고,,,, SEND!
하지만 이게 내가 원하는 값이 맞나?!!?!?!?!?!?
테스트 코드 작성 시 기댓값을 테스트코드에 적어놓은 뒤, 결과값이 기댓값과 맞으면 Success, 틀리면 Fail로 나오기 때문에 두 눈으로 비교하지 않아도 JUnit라이브러리가 알아서 화면에 띄워준다.
v 표시가 떴다면 기댓값과 결과값이 일치한다는 의미이므로, 눈으로 비교하지 않아도 된다.
코드를 개발 및 리팩토링을 진행하면서 많은 걱정이 존재할 것이다. "내 코드가 진짜 잘 돌아갈까?" , "리팩토링했다가 로직이 꼬여버리면 어쩌지?!" , "이 라이브러리를 사용하는 것보다 다른 라이브러리를 사용하는 게 더 효율적이야! 근데 이걸 적용하다가 또 로직이 꼬여버리면 어쩌지!?" 등의 많은 고민이 있을 것이다.
실제로 첫 프로젝트를 진행하며 테스트코드를 작성하지 않았던 탓에 서비스 확장 및 리팩토링을 하기 너무 두려웠던 경험이 있다. 또한 이런 불안함을 가지고 배포까지 진행했던 프로젝트기 때문에 언제 오류가 터져 서버가 다운되어도 모르는 불안정한 서버인 채로 배포되었다.
이런 불안감을 완벽한 테스트코드 한 번으로 떨쳐낼 수 있으니 얼마나 좋은가?
불안감을 갖고 완성한 코드를 배포한 뒤, 클라이언트를 맡은 친구에게 "서버 올렸어! 더미 데이터 말고 이제 직접 통신 잘 되는지 확인해 보자!"라고 말한 지 얼마 지나지 않자 제게 온 카톡 "뭐 잠깐 연동해서 테스트했는데 서버가 다운됐는데? 확인 부탁해!"
맙소사 역시 이럴 줄 알았어! 그렇게 밤을 꼬박 지새우며 디버깅하다 일부 설정파일이 잘못된 것을 발견하여 고쳐 다시 배포.....
테스트코드가 있었다면 이를 미리 발견할 수 있지 않았을까!?
이 모든 잡담을 정리하자면 다음과 같다.
직접 서버를 구동시켜 메뉴얼대로 하나하나 클릭하지 않아도 된다.
각 레이어별 단위 테스트를 작성하게 된다면, 개발 단계에서 어느 레이어에서 문제가 발생했는지 한눈에 알기 쉽다.
통합테스트까지 완료를 한다면 과감한 확장이 가능해진다.
빌드 시 테스트코드를 통해 안정적인 서버를 배포할 수 있다.
번거롭다
컴팩트하지 않은 테스트코드는 잘못하면 독이 될 수 있다.
느린 배포시간
리팩토링
Given / When / Then 패턴을 주로 사용한다.
Given
When
Then
단위테스트
통합테스트
단위테스트는 해당 단위의 기능을 검증하기 위한 테스트이다.
예를들어 Controller - Service - Repository 구조에서 Service레이어를 테스트하기 위해 아래와 같은 테스트코드를 작성했다면 단위테스트일까?
@Test
public void saveSuccessTest(){
boolean result = memberService.save(대충 알맞은 DTO객체);
assertThat(result).isTrue();
}
답은 아니다. 오롯이 서비스 레이어만 테스트를 진행한게 아닌, 의존관계를 맺고있는 실제 DB커넥션을 하고있는 Repository레이어까지 함께 검증을 하게된것이다. 따라서 테스트용 DB설정정보가 잘못되거나, 테이블이 잘못되어 오류가 발생하게 되면, 위의 테스트코드는 올바른 테스트코드라고 할지라도 실패를 하게된다.
따라서 해당 레이어만을 테스트하고 싶으면, 연관관계를 맺고있는 Repository레이어를 Mocking시켜 DI시킨다면, 실제 DB에 커넥션을 맺는 과정이 아닌, 개발자가 커스텀한 로직을 따르도록하며 DB와의 종속관계를 끊어버릴 수 있게된다.