[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 not only a web developer.

0개의 댓글