Spring 테스트에 대해 공부하다보면 "단위 테스트가 중요하다!"라는 말을 한번쯤은 듣게 된다.
도대체 단위 테스트가 무엇이길래 그렇게 강조를 하는걸까?
단위 테스트 : 하나의 기능 또는 메소드 기준, 독립적으로 진행되는 가장 작은 단위의 테스트
Mock
, Stub
같은 방법을 이용실무에서는 거의 대부분 단위 테스트를 작성한다.
통합 테스트는 여러 컴포넌트를 연결해 테스트하기 때문에 컴포넌트가 많아질수록 테스트 시간이 늘어난다.
이외에 단위 테스트는 통합 테스트와 비교하여 많은 장점을 갖고 있다.
하나씩 알아보며 단위 테스트가 왜 필요한지 알아보자.
하지만 자신이 개발하는 컴포넌트에서 외부 컴포넌트가 필요할 때,
예를 들어 memberService
를 개발하고 있는데 memberTokenService
가 필요할 때 외부 컴포넌트가 완성되지 않으면 내 코드가 잘 작동하는 지 확인할 수 없다.
그래서 memberTokenService
가 완성되기를 기다렸다가 테스트를 거쳐 비로소 code push가 가능할 것이다.
이에 비해 단위 테스트를 사용하면 Mock
을 이용하여 API문서에 따라 반환 값을 설정할 수 있다.
즉, 가상의 memberTokenService
를 만들어 내 코드를 테스트 해볼 수 있으므로 더이상 기다릴 필요가 없어진다.
Mock
에 대한 개념은 추후에 좀 더 자세히 알아보자.
그래서 새로운 기능이 추가돼도 이전에 작성한 테스트 코드에는 아무런 영향이 없다.
즉, 새로운 기능이 추가되거나 이전 기능에 수정이 가해질 때 기존에 작성한 기능이 잘 작동하는지 판단할 수 있는 근거가 된다.
이 과정에서 잘 작동하던 기능이 망가지면 우리는 다시 변경된 로직을 찾아야한다.
만약 리펙토링 후에 단위 테스트가 실패한다면,
우리는 기존 로직이 변경됐다는 것을 알아채고 해당 기능에 대한 디버깅을 진행할 수 있다.
예를 들어 하나의 단위 테스트가 너무 길거나 복잡하면,
이것은 해당 기능의 코드들이 비효율적으로 작성됐다는 증거이기 때문에 리펙토리를 진행해야 한다.
그것이 아니라면 하나의 테스트에서 많은 기능을 수행하기 때문일 수도 있다.
이 경우에는 테스트 클래스 내부에서의 리펙토링이 필요하다는 뜻이기도 하다.
단위 테스트의 대표적인 장점에 대해 알아보았다.
물론 비즈니스 로직 개발이 급하거나 하는 등의 경우에는 테스트 작성에 부담을 느낄 수 있다.
하지만 조금만 더 길게 보았을 때 더 효율적인 코드를 만들고 유지보수에 들어가는 시간, 비용을 줄이기 위해서 우리는 테스트 코드 작성의 룰을 세우고 단위 테스트를 작성해야 할 필요성이 있다.