[TDD] Test Double

이홍준·2023년 8월 1일
0

TDD

목록 보기
2/3

TDD를 진행하면서 사전에 이론적으로 알아야할 부분들이 필요하다고 느꼈다. 그냥 무턱대고 하기엔 다소 이해하기 힘든 부분들이 많았다. 테스트 코드를 작성해보면서 이게 맞는지 계속 의문이 들었다. 기본적인 용어부터 시작해서 여러가지 가치관에 대해 알 필요가 생겼기 때문에 Test Double이라는

용어에 대해 알아보자

What is Test Double?

스턴드 더블(스턴트맨)에서 아이디어를 얻어서 만든 용어이며, 실제 객체로 테스트를 진행하기 어려운 경우 대신해서 진행할 수 있는 객체를 말한다.

Test Double의 목적

  • 테스트 대상 코드를 외부에 독립성을 보장한다.
  • 독립적으로 실행되기 떄문에 속도를 개선할 수 있다.
  • 예측 불가능한 실행 요소들을 제거

Test Double의 종류

  1. Dummy

    • 가장 기본적인 형태
    • 인스턴스화 된 객체가 필요하지만 기능은 필요하지 않는 경우에 사용
    • 해당 Dummy 객체의 메서드가 호출되었을 때 정상 동작은 보장하지 않음
    • 전달되지만 사용되지는 않는 객체
  2. Stub

    • dummy 객체가 실제로 동작하는 것 처럼 보이게 만들어 놓은 객체
    • 실제 코드나 아직 준비되지 않은 코드들의 동작들을 가정함
    • 호출자를 실제 구현체와 격리시키는 목적으로 사용 가능
    • 인테페이스, 기본 클래스가 최소한으로 구현된 상태
    • 테스트에 호출된 요청에 대해 미리 준비해둔 결과를 제공
  3. Fake

    • 복잡한 로직이나 객체 내부에서 필요로 하는 다른 외부 객체들의 동작을 단순화해서 구현한 객체
    • 동작의 구현을 가지고 있지만 실제 프로덕션에는 적합하지 않은 객체(Fake Database)
  4. Spy

    • stub의 역할을 가지면서 호출된 내용에 대해 약간의 정보들을 기록한다.
    • 테스트에서 확인하기 위한 정보다.
  5. Mock

    • 호출에 대한 기대를 명세하고 내용에 따라 동작하도록 프로그래밍 된 객체
    • 테스트 작성을 위한 환경 구축이 어려울 때 사용
    • 타 부서와의 협의나 정책이 필요한 경우에도 필요
    • 테스트가 특정 경우나 순간에 의존적일 때
    • 테스트 시간이 오래 결리는 경우
    		@Mock
        private CreateUserUseCase createUserUseCase;
        @Test
        public void createUserTest(){
            CreateUserCommand userCommand = new CreateUserCommand("zxc123", "비밀번호1","이름1","별명1");
            CreateUserResponse createUserResponse = CreateUserResponse.builder()
                    .id(1L)
                    .email("zxc123@naver.com")
                    .password("비밀번호1")
                    .name("이름1")
                    .nickname("별명1")
                    .build();
    
            when(createUserUseCase.createUser(userCommand)).thenReturn(createUserResponse);
            SuccessApiResponse response = userController.createUser(userCommand);
            verify(createUserUseCase, times(1)).createUser(userCommand);
            assertEquals(createUserResponse, response.getData());
        }

결론

테스트 코드를 작성하는데 편리하도록 도와주는 도구들이 많다. 그 중에 하나는 Test Double인데 대신 해서 진행함으로써 테스트의 진행속도에 도움을 주는 방법이 있다. 그것은 총 Dummy, Stub, Spy, Fake, Mock들이 있고 각 객체들의 역할에 맞게 적절히 사용하는 것이 중요하다고 생각한다.

어떤 방법이 효율적인 방법인지 알아야 한다. 그러기 위해서 다음에는 TDD 방법들중에 2가지인 Classiscist TDD, Mockist TDD에 대해 알아볼 계획이다.


References

profile
I'm a web developer.

0개의 댓글