토비의 스프링 5장 서비스 추상화를 읽고 테스트와 관련된 내용을 별도로 정리합니다.
최근에 테스트 대역이라는 용어를 처음 접했다. 여기서 사용된 '대역'이라는 용어의 뜻은 '배우가 맡은 역할을 사정상 할 수 없을 때에 다른 사람이 그 역할을 대신 맡아 하는 일. 또는 그 사람'(네이버 국어사전)이라는 뜻을 의미한다. 처음 이 용어를 들었을 때 테스트가 커버하고 있는 특정 범위라는 뜻의 단어라고 생각했던 기억이 난다. 그래서 단어 정리부터 하고 시작한다. 여기서 대역은 '대역 배우' 할 때의 대역이다. 영어로 Double 이라고 하더라.
좋은 설계에 대해 이야기하다보면 관심사에 대한 이야기가 자주 등장한다. 테스트에서 역시 테스트의 관심사(어떤 조건에서 어떤 입력을 가하면 어떤 출력을 기대하는가)를 바르게 이해하고 관심사에 집중하는 것은 중요하다. 그런데 테스트에서 집중하고 있는 관심사는 아니지만 관심있는 테스트를 수행하기 위해 필수적으로 필요로 하는 의존 대상이 존재할 수 있다. 이 때 만약 의존 대상이 일관된 동작을 하도록 설정하는데 시간이 많이 걸리거나 매우 까다롭다면(외부 DB를 설정하거나, API 서버와 연동하는 등) 이를 테스트 대역으로 대체하여 테스트를 진행할 수 있다.
테스트 대역을 사용하는 케이스는 크게 다음의 4 가지 경우가 존재한다.
테스트에서 의존하는 까다로운 객체를 테스트 대역으로 교체하기 위해서는 테스트 대상 객체가 의존 객체를 인터페이스로서 참조하고 DI를 통해 구현 객체를 주입받도록 해야한다. 그렇지 않다면 테스트 대역을 사용하기 위해 서비스 코드를 수정해야 하는 일이 생기는데 테스트를 위해 서비스 코드를 수정하는 것은 좋은 방법이 아닌 것 같다. 종종 의존하는 객체가 절대 바뀌지 않는 하드한 대상이라면 인터페이스를 통해 의존관계를 주입받지 않고 구현 클래스를 직접 생성하는 결정을 할 수도 있는데 그렇게 되면 서비스 코드 수정 없이 테스트 대역을 사용할 수 없음을 고려해야 한다. 테스트에서도 절대 바뀔 일이 없다면 그렇게 해도 되지 않을까?
테스트 대역을 사용함으로 테스트 대상 코드는 수정하지 않고, 테스트 관심사에 집중하여 테스트를 빠르게, 자주 실행할 수 있게 된다.