在 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中文网其他相关文章!