如何测试包含 log.Fatal() 的 Go 函数

说,我有以下代码可以打印一些日志消息。我将如何测试是否记录了正确的消息?由于log.Fatal调用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)

    }

}


慕尼黑的夜晚无繁华
浏览 174回答 3
3回答

繁花不似锦

虽然可以测试包含 log.Fatal 的代码,但不建议这样做。特别是,您不能以 上的-cover标志支持的方式测试该代码go test。相反,建议您更改代码以返回错误而不是调用 log.Fatal。在顺序函数中,您可以添加额外的返回值,而在 goroutine 中,您可以在类型为通道chan error(或某些包含错误类型字段的结构类型)上传递错误。一旦进行了更改,您的代码将更易于阅读,更易于测试,并且更易于移植(现在除了命令行工具之外,您还可以在服务器程序中使用它)。如果您有log.Println电话,我还建议将自定义记录器作为接收器上的字段传递。这样您就可以登录到自定义记录器,您可以将其设置为服务器的 stderr 或 stdout,以及用于测试的 noop 记录器(这样您就不会在测试中获得一堆不必要的输出)。该log包支持自定义记录器,因此无需为此编写自己的或导入第三方包。

肥皂起泡泡

我使用以下代码来测试我的功能。在 xxx.go 中:var logFatalf = log.Fatalfif err != nil {    logFatalf("failed to init launcher, err:%v", err)}在 xxx_test.go 中:// TestFatal is used to do tests which are supposed to be fatalfunc TestFatal(t *testing.T) {    origLogFatalf := logFatalf    // After this test, replace the original fatal function    defer func() { logFatalf = origLogFatalf } ()    errors := []string{}    logFatalf = func(format string, args ...interface{}) {        if len(args) > 0 {            errors = append(errors, fmt.Sprintf(format, args))        } else {            errors = append(errors, format)        }    }    if len(errors) != 1 {        t.Errorf("excepted one error, actual %v", len(errors))    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go