테스트 대역(Double)

주싱·2022년 10월 9일
0

더 나은 테스트

목록 보기
9/16

토비의 스프링 5장 서비스 추상화를 읽고 테스트와 관련된 내용을 별도로 정리합니다.

대역(Double)이 뭐야?

최근에 테스트 대역이라는 용어를 처음 접했다. 여기서 사용된 '대역'이라는 용어의 뜻은 '배우가 맡은 역할을 사정상 할 수 없을 때에 다른 사람이 그 역할을 대신 맡아 하는 일. 또는 그 사람'(네이버 국어사전)이라는 뜻을 의미한다. 처음 이 용어를 들었을 때 테스트가 커버하고 있는 특정 범위라는 뜻의 단어라고 생각했던 기억이 난다. 그래서 단어 정리부터 하고 시작한다. 여기서 대역은 '대역 배우' 할 때의 대역이다. 영어로 Double 이라고 하더라.

테스트 대역이 왜 필요한가?

좋은 설계에 대해 이야기하다보면 관심사에 대한 이야기가 자주 등장한다. 테스트에서 역시 테스트의 관심사(어떤 조건에서 어떤 입력을 가하면 어떤 출력을 기대하는가)를 바르게 이해하고 관심사에 집중하는 것은 중요하다. 그런데 테스트에서 집중하고 있는 관심사는 아니지만 관심있는 테스트를 수행하기 위해 필수적으로 필요로 하는 의존 대상이 존재할 수 있다. 이 때 만약 의존 대상이 일관된 동작을 하도록 설정하는데 시간이 많이 걸리거나 매우 까다롭다면(외부 DB를 설정하거나, API 서버와 연동하는 등) 이를 테스트 대역으로 대체하여 테스트를 진행할 수 있다.

4가지 타입 테스트 대역

테스트 대역을 사용하는 케이스는 크게 다음의 4 가지 경우가 존재한다.

  • 테스트 대상이 출력하는 값을 받아주기만 하면 되는 경우(의존 대상의 이후 처리는 정상이라고 가정)
  • 테스트 대상이 일관된 동작을 하도록 의존 대상이 의도한 고정 입력을 반환하는 경우
  • 테스트 수행 중 의존 대상에서 발생할 수 있는 예외를 모의하는 경우
  • 테스트 대상이 의존 대상에 요청하는 값 자체를 검증하는 경우

전략 패턴/DI 없이 불가능

테스트에서 의존하는 까다로운 객체를 테스트 대역으로 교체하기 위해서는 테스트 대상 객체가 의존 객체를 인터페이스로서 참조하고 DI를 통해 구현 객체를 주입받도록 해야한다. 그렇지 않다면 테스트 대역을 사용하기 위해 서비스 코드를 수정해야 하는 일이 생기는데 테스트를 위해 서비스 코드를 수정하는 것은 좋은 방법이 아닌 것 같다. 종종 의존하는 객체가 절대 바뀌지 않는 하드한 대상이라면 인터페이스를 통해 의존관계를 주입받지 않고 구현 클래스를 직접 생성하는 결정을 할 수도 있는데 그렇게 되면 서비스 코드 수정 없이 테스트 대역을 사용할 수 없음을 고려해야 한다. 테스트에서도 절대 바뀔 일이 없다면 그렇게 해도 되지 않을까?

테스트 대역을 통해 얻는 이점

테스트 대역을 사용함으로 테스트 대상 코드는 수정하지 않고, 테스트 관심사에 집중하여 테스트를 빠르게, 자주 실행할 수 있게 된다.

관련된 글

profile
소프트웨어 엔지니어, 일상

0개의 댓글