为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑的夜晚无繁华 2021-10-11 13:52:20
说,我有以下代码可以打印一些日志消息。我将如何测试是否记录了正确的消息?由于log.Fatal调用os.Exit(1)测试失败。package mainimport (    "log")func hello() {    log.Print("Hello!")}func goodbye() {    log.Fatal("Goodbye!")}func init() {    log.SetFlags(0)}func main() {    hello()    goodbye()}以下是假设性测试:package mainimport (    "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)    }}
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

虽然可以测试包含 log.Fatal 的代码,但不建议这样做。特别是,您不能以 上的-cover标志支持的方式测试该代码go test

相反,建议您更改代码以返回错误而不是调用 log.Fatal。在顺序函数中,您可以添加额外的返回值,而在 goroutine 中,您可以在类型为通道chan error(或某些包含错误类型字段的结构类型)上传递错误。

一旦进行了更改,您的代码将更易于阅读,更易于测试,并且更易于移植(现在除了命令行工具之外,您还可以在服务器程序中使用它)。

如果您有log.Println电话,我还建议将自定义记录器作为接收器上的字段传递。这样您就可以登录到自定义记录器,您可以将其设置为服务器的 stderr 或 stdout,以及用于测试的 noop 记录器(这样您就不会在测试中获得一堆不必要的输出)。该log包支持自定义记录器,因此无需为此编写自己的或导入第三方包。


查看完整回答
反对 回复 2021-10-11
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我使用以下代码来测试我的功能。在 xxx.go 中:


var logFatalf = log.Fatalf


if err != nil {

    logFatalf("failed to init launcher, err:%v", err)

}

在 xxx_test.go 中:


// TestFatal is used to do tests which are supposed to be fatal

func 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))

    }

}


查看完整回答
反对 回复 2021-10-11
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信