首页  >  文章  >  后端开发  >  如何在不修改函数的情况下在 Go 测试中测试记录的输出?

如何在不修改函数的情况下在 Go 测试中测试记录的输出?

DDD
DDD原创
2024-11-11 07:28:03163浏览

How to Test Logged Output in Go Tests Without Modifying the Function?

在 Go 测试中测试记录的输出

在 Go 中,单元测试通常涉及验证被测试函数生成的输出或日​​志。假设我们有一个在某些情况下记录错误的函数。

问题:

给定以下函数 readByte 记录错误消息:

func readByte(/*...*/) {
    // ...
    if err != nil {
        fmt.Println("ERROR")
        log.Print("Couldn't read first byte")
        return
    }
    // ...
}

如何使用 go test 来测试 readByte 中的输出错误而不修改函数本身?

解决方案:

为了捕获日志输出,我们可以在测试过程中将日志包的输出重定向到临时缓冲区,然后断言缓冲区的内容。

示例代码:

在readbyte_test.go中文件:

package main

import (
    "bytes"
    "fmt"
    "io"
    "log"
    "os"
    "testing"
)

func readByte( /*...*/ ) {
    // ...
    err := io.EOF // Force an error
    if err != nil {
        fmt.Println("ERROR")
        log.Print("Couldn't read first byte")
        return
    }
    // ...
}

func TestReadByte(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)
    defer func() {
        log.SetOutput(os.Stderr)
    }()
    readByte()
    t.Logf("Output: %s", buf.String())
}

示例输出:

$ go test -v readbyte_test.go
=== RUN   TestReadByte
--- PASS: TestReadByte (0.00s)
        readbyte_test.go:30: Output: ERROR
        Couldn't read first byte
PASS
ok      command-line-arguments  0.004s
$ 

在此示例中,现在可以使用 Go 的内置测试工具来测试和验证输出错误消息不改变原来的 readByte 函数。

以上是如何在不修改函数的情况下在 Go 测试中测试记录的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn