[go] Go 언어 테스트에서 테스트 더블 사용하기

Go 언어로 테스트를 작성할 때, 종종 실제 의존성을 가진 객체 대신 테스트 더블을 사용해야 할 때가 있습니다. 테스트 더블은 실제 객체의 대역으로 가짜나 모의 객체를 말합니다. 이를 통해 의존성을 줄이고 테스트의 안정성을 향상시킬 수 있습니다.

테스트 더블이란?

테스트 더블에는 다양한 종류가 있지만, 대표적으로 다음과 같은 종류가 있습니다.

  1. 스파이(Spy): 메서드 호출 및 속성 변경을 관찰하여 확인하는 용도로 사용됩니다.
  2. 헬퍼(Helper): 특정 작업을 수행하는 메서드를 가지고 있는 객체로, 테스트에서 코드를 재사용하기 위해 사용됩니다.
  3. 가짜(Fake): 실제 객체의 간단한 대역으로, 가벼운 테스트 용도로 사용됩니다.
  4. 모의(Mock): 특정 시나리오에 대한 행동을 정의한 객체로, 특정 메서드가 호출되었을 때의 동작을 정의할 수 있습니다.

Go 언어에서 테스트 더블 사용하기

Go 언어에서는 테스트 더블을 만들기 위해 자체적으로 제공하는 방법이 없지만, 인터페이스를 활용하여 테스트 더블을 사용할 수 있습니다. 예를 들어, 의존성이 있는 객체를 인터페이스로 추출한 뒤, 해당 인터페이스를 구현하는 테스트 더블을 만들어 사용할 수 있습니다.

type Notifier interface {
    Notify(message string) error
}

type MockNotifier struct {
    Called bool
}

func (m *MockNotifier) Notify(message string) error {
    m.Called = true
    return nil
}

위의 예시에서 Notifier 인터페이스를 구현하는 MockNotifier 테스트 더블을 만들었습니다. 이제 이 테스트 더블을 사용하여 의존성을 주입하여 테스트를 진행할 수 있습니다.

func TestSomething(t *testing.T) {
    notifier := &MockNotifier{}
    // ... notifier를 의존성으로 주입하여 테스트를 진행
}

위와 같이 테스트 더블을 사용하면 실제 의존성을 가진 객체를 사용하는 것보다 테스트의 격리성을 높이고 안정성을 확보할 수 있습니다.

결론

테스트 더블은 Go 언어에서 테스트 작성 시 의존성을 줄이고 테스트의 격리성을 확보하기 위한 중요한 도구입니다. 인터페이스를 통한 추상화를 활용하여 테스트 더블을 만들고 사용하면, 효율적으로 테스트를 작성할 수 있습니다.

위의 내용을 통해 테스트 더블의 필요성과 Go 언어에서의 활용 방법에 대해 알아보았습니다. 테스트 더블을 적절히 활용하여 안정적이고 견고한 테스트를 작성하는 데 도움이 되길 바라겠습니다.