首页 > 解决方案 > Go:在套件运行后打印文本?

问题描述

测试包会捕获所有输出并且不会打印它,除非测试失败或-v打开了详细 ( )。有没有办法在套件完成输出文本而无需打开详细信息?

例如:

func TestMain(m *testing.M) {
    status := m.Run(m)
    fmt.Println("important line to output")
    os.Exit(status)
}

不会打印该行。


编辑:我发现fmt.Println如果您从包 ( ) 内部运行测试,这将起作用go test,但如果指定了一个或多个包 ( go test ./...),除非-v启用该选项。

标签: gotesting

解决方案


测试包捕获所有输出,除非测试失败或打开详细 (-v),否则不会打印它

是什么让你说标准输出被捕获?如果我将此代码保存到main_test.go并运行go test

package main

import (
    "fmt"
    "os"
    "testing"
)

func TestJoe(t *testing.T) {
    fmt.Println("from joe")
}

func TestMain(m *testing.M) {
    fmt.Println("before run")
    s := m.Run()
    fmt.Println("after run")
    os.Exit(s)
}

我得到:

$ go test
before run
from joe
PASS
after run

关于使用./...的输出,以下摘录自go help test

第二种称为包列表模式,发生在使用显式包参数调用 go test 时(例如“go test math”、“go test ./...”,甚至“go test.”)。在这种模式下, go test 编译和测试命令行中列出的每个包。如果包测试通过,go test 只打印最后的“ok”摘要行。如果包测试失败, go test 会打印完整的测试输出。如果使用 -bench 或 -v 标志调用,即使通过包测试, go test 也会打印完整输出,以显示请求的基准测试结果或详细日志记录。


推荐阅读