>백엔드 개발 >Golang >Go에서 테스트하기 위해 전역적으로 `time.Now()`를 효과적으로 스텁아웃하려면 어떻게 해야 합니까?

Go에서 테스트하기 위해 전역적으로 `time.Now()`를 효과적으로 스텁아웃하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-01 06:16:10301검색

How Can I Effectively Stub Out `time.Now()` Globally for Testing in Go?

Stubbing Out time.Now() 전역적으로: 대안 탐색

시간에 민감한 기능에 의존하는 코드를 테스트할 때 다음 사항이 필요합니다. 시간 진행을 시뮬레이션합니다. 사용자 정의 시간 인터페이스를 구현하는 것은 효과적인 솔루션일 수 있지만 실제 경과 시간을 추적하기 위해 변수를 전달해야 하기 때문에 사용법이 번거로울 수 있습니다.

사용자 정의 시간 패키지

대안으로 표준 라이브러리의 시간 패키지를 둘러싸는 사용자 정의 시간 패키지를 만드는 것을 고려해 보세요. 이 접근 방식을 사용하면 실시간 구현과 테스트용 모의 구현 간에 원활하게 전환할 수 있습니다. 예:

// custom_time.go
package custom_time

import (
    "time"
    "sync"
)

var (
    mockTime time.Time
    mockMutex sync.Mutex
)

func SetMockTime(t time.Time) {
    mockMutex.Lock()
    mockTime = t
    mockMutex.Unlock()
}

func ResetMockTime() {
    mockMutex.Lock()
    mockTime = time.Time{}
    mockMutex.Unlock()
}

func Now() time.Time {
    mockMutex.Lock()
    defer mockMutex.Unlock()
    if mockTime != (time.Time{}) {
        return mockTime
    }
    return time.Now()
}

맞춤형 패키지의 장점

  • 전역 범위: 이 접근 방식은 time.Now()를 스텁합니다. 테스트 내 시간 패키지의 모든 인스턴스 범위.
  • 간편한 전환: SetMockTime 및 ResetMockTime 함수를 사용하면 실제 시간과 모의 시간 간 전환이 간단합니다.
  • 유지 관리성: 별도의 시간 유지 테스트 목적의 패키지는 코드를 향상시킵니다.

Custom Package의 단점

  • 추가 추상화: 추가 레이어로 인해 약간의 오버헤드가 발생할 수 있습니다. 추상화.

주의사항 시스템 시계 수정

시간 진행을 시뮬레이션하기 위해 테스트 중에는 시스템 시계를 수정하지 않는 것이 좋습니다. 이는 정확한 시스템 시간에 의존하는 다른 시스템 구성 요소에 예측할 수 없는 결과를 초래할 수 있습니다.

위 내용은 Go에서 테스트하기 위해 전역적으로 `time.Now()`를 효과적으로 스텁아웃하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.