>백엔드 개발 >Golang >`log.Fatal()`을 사용하여 Go 기능을 효과적으로 테스트하는 방법은 무엇입니까?

`log.Fatal()`을 사용하여 Go 기능을 효과적으로 테스트하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 10:59:11868검색

How to Effectively Test Go Functions Using `log.Fatal()`?

log.Fatal()이 포함된 Go 함수 테스트

log.Fatal()을 활용하여 인쇄하는 Go 함수가 있는 시나리오를 고려해보세요. 메시지. log.Fatal()이 os.Exit(1)을 트리거하여 테스트 실패를 유발하므로 이러한 기능을 테스트하는 것은 어려울 수 있습니다.

접근 방식:

이 문제를 극복하려면 다음을 수행하십시오. 출력을 표준 log.xxx() 대상으로 리디렉션하는 사용자 정의 로거를 구현하는 것이 좋습니다. 그러나 테스트 중에 log.Fatalf()와 같은 함수를 os.Exit(1)을 호출하지 않는 자체 구현으로 쉽게 바꿀 수 있습니다.

예:

로그를 인쇄하는 다음 코드가 있다고 가정합니다.

package main

import (
    "log"
)

func hello() {
    log.Print("Hello!")
}

func goodbye() {
    log.Fatal("Goodbye!")
}

func init() {
    log.SetFlags(0)
}

func main() {
    hello()
    goodbye()
}

이 코드를 테스트하기 위해 다음과 같이 공식화할 수 있습니다. 가상 테스트:

package main

import (
    "bytes"
    "log"
    "testing"
)


func TestHello(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    hello()

    wantMsg := "Hello!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

func TestGoodby(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    goodbye()

    wantMsg := "Goodbye!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

참고:

이 접근 방식은 테스트 중에 특정 로거 기능을 교체하는 유연성을 부여하므로 원래 기능에 영향을 주지 않고 동작을 사용자 정의할 수 있습니다. 테스트 중입니다.

위 내용은 `log.Fatal()`을 사용하여 Go 기능을 효과적으로 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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